我收到一些数据,它们是表示 uint16 的小端字节数组,但我想将其存储在 int
中。我已将此数据包装到 ByteBuffer
中,因此我可以调用 ByteBuffer.get()
来获取下一个字节,但我不确定如何转换这 2 个字节从 uint16 到 int
的字节。
byte[] data = //From UDP socket
ByteBuffer bb = ByteBuffer.wrap(data);
bb = bb.order(ByteOrder.LITTLE_ENDIAN);
while(bb.hasRemaining()){
int n = //What goes here?
}
感谢您的帮助:)
最佳答案
我认为主要的复杂性是如何在 Java 中表示 uint16。我建议使用 Java int 或 Java long,因为至少 16 位与 uint16 中的含义相同(但不是 Java < em>short:它有 16 位,但有符号)。
1) 如果您仅收到 uint16,没有字符,没有其他类型,那么最简单的方法如下。将 16 位读入 Java short,然后将其转换为 int:
byte[] data = //From UDP socket
ByteBuffer bb = ByteBuffer.wrap(data);
bb = bb.order(ByteOrder.LITTLE_ENDIAN);
while(bb.hasRemaining()){
short s = bb.getShort();
int n = 0xFFFF & s;
...
}
2) 如果您不仅收到 uint16,还收到一些其他类型(例如字符),那么您可以从 2 个字节构造值:
byte[] data = //From UDP socket
ByteBuffer bb = ByteBuffer.wrap(data);
while(bb.hasRemaining()) {
if (consider next bytes as uint16) {
byte b1 = bb.get();
byte b2 = bb.get();
int i1 = 0xFF & b1; // Consider b1 as int, not the same as "(int) b1"
int i2 = 0xFF & b2; // Consider b2 as int, not the same as "(int) b2"
int n = b2 * 256 + b1;
...
} else {
// Read next bytes as char or something other
}
}
关于java - 如何将存储为小端字节数组的 uint16 转换为 int?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59556097/