gpt4 book ai didi

java - 网络字节序到主机字节序转换Java

转载 作者:行者123 更新时间:2023-11-29 04:34:36 26 4
gpt4 key购买 nike

我正在通过 jna 使用 windows-dll 与一些加密狗服务器进行通信。 dll提供了三个函数,分别是connect、disconnect和获取dongle的连接状态。连接和断开工作。但是当我查询状态时,设备应该返回一个我保存到 DWORD 中的 IP 地址。代码类似于,其中 DWORDByReference IpAddress 是一个输出参数:

int AwUsbGetConnectionStatus(字符串集线器、DWORDByReference IpAddress、IntByReference 状态、DWORD 超时、HANDLE 事件);
DWORD 值 = ipAddress.getValue();

dll 的规范指出:“IpAddress 采用主机字节顺序,可以使用 WinSock htonl 函数将其转换为 TCP/IP 网络字节顺序。”

在另一个线程中,我读到与 htonl 等效的 java 是:

static int htonl(int val) {
返回 ByteBuffer.allocate(4).putInt(val)
.order(ByteOrder.nativeOrder()).getInt(0);
}

但问题是,我得到了奇怪的值。但不知何故,它们确实对应于 ip 地址的假定值。
比如原来的Ip是:192.168.102.118
它返回 1986439360
当我用上面的方法转换它时,它是-1062705546。
但我想正确转换后应该是192168102118

我试过的另一个 IP 地址是:192.168.102.112为此我得到 1885776064当我将其转换为 -106270552

因此,对于原始地址和转换后的值,IP 地址之间的差异仍然是 6。我用不同的 Ips 尝试了这个,Ips 之间的差异总是与假定值相匹配。那么有谁知道,如果我转换 dll 函数返回的值的方式有问题,或者当我获取 DWORD 参数的值时甚至会出现问题吗?

最佳答案

您应该在将小端地址放入其中之前设置顺序。

看起来(从您的评论“我猜正确转换后应该是 192168102118”)您想要点分四边形输出;为此,使用字节数组可能更自然:

static byte[] htoip(int ipv4) {
return ByteBuffer.wrap(new byte[4])
.order(ByteOrder.nativeOrder())
.putInt(ipv4)
.array();
}

这个结果适合传递给InetAddress.getByAddress()

虽然这不是反转 4 个字节的最简单方法,但它对 ByteOrder.nativeOrder() 的使用使其可移植且面向 future 。

关于java - 网络字节序到主机字节序转换Java,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42231549/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com