いくつかのドングルサーバーと通信するために、jna経由でwindows-dllを使用しています。 dllには、接続、切断、ドングルの接続状態の3つの機能があります。接続と切断の作業。しかし、私がステータスを照会するとき、デバイスは私がDWORDに保存するIPアドレスを返すべきです。ネットワークバイトオーダーからホストバイトオーダーへの変換Java
int AwUsbGetConnectionStatus(String Hub, DWORDByReference IpAddress, IntByReference Status, DWORD Timeout, HANDLE Event); DWORD value = ipAddress.getValue();
DLLの状態の仕様:コードはDWORDByReference IpAddress
がアウトパラメータである、のようなものである「IPアドレスは、ホストバイトオーダーにあり、使用してTCP/IPのネットワークバイトオーダーに変換することができますWinSock htonl関数。 "
static int htonl(int val) { return ByteBuffer.allocate(4).putInt(val) .order(ByteOrder.nativeOrder()).getInt(0); }
しかし、問題は、私は奇妙な値を得ることを、次のとおりです。
は別のスレッドでは、私はhtonlと同じJavaであることを読みました。しかし、どういうわけか彼らは想定されているipアドレスの値に対応しています。たとえば、元のIpが192.168.102.118
の場合は、1986439360
が返され、上記の方法で変換すると、-1062705546になります。
は、しかし、私は
正しく変換するとき、それは192168102118でなければならないと思い、私が試してみました。また、別のIPアドレスだった: 192.168.102.112 いる私は1885776064 を取得し、私はそれがとても-106270552
だと変換するときIPアドレスの差は元のアドレスと変換された値ではまだ6です。私はこれをさまざまなIpsで試しました。そして、Ipsの違いは常に想定される値と一致します。 だから、誰かが知っている、私は値を変換する方法に何か間違っている場合、またはDWORDパラメータの値を取得するときにも問題がある可能性がありますか?
「192168102118」は32ビット値では大きすぎます。各数値の文字列値を連結しません。迅速な健全性チェック。 10桁以上ある場合は、 'int'ではありません。 –
注: 'Integer.reverseBytes(x)'はずっと速く/簡単です。 –