Answers:
使用网络字节顺序(大字节序),这与Java始终使用的顺序相同。有关C中不同翻译器的信息,请参见man htons。
我通过Google偶然发现了这里,并得到了Java是大型字节序的答案。
仔细阅读答复,我想指出字节确实有一个字节顺序,尽管有幸,如果您只处理“主流”微处理器,那么您不可能像Intel,Motorola和Zilog那样遇到过字节在他们的UART芯片的移位方向上达成了共识,MSB是一个字节,2**7
而LSB将2**0
在他们的CPU中(我使用FORTRAN功率符号来强调这个东西的年代:))。
20年前,当我们用Mac电脑替换了价值1万美元的接口硬件时,我遇到了一些航天飞机位串行下行链路数据的问题。很久以前有一篇关于它的美国宇航局技术简介。table[0x01]=0x80
在将每个字节从位流移入后,我只使用了256个元素的查找表,将位反转了(等等)。
Java中没有无符号整数。所有整数都是带符号的,并且采用大端字节序。
在C端,每个字节的开头是LSB,左边是MSB,结尾是MSB。
听起来您是将LSB用作最低有效位,对吗?LSB通常代表最低有效字节。 字节序不是基于位而是基于字节。
要将无符号字节转换为Java整数:
int i = (int) b & 0xFF;
要将byte []中的无符号32位little-endian转换为Java long(从我的头顶开始,未经测试):
long l = (long)b[0] & 0xFF;
l += ((long)b[1] & 0xFF) << 8;
l += ((long)b[2] & 0xFF) << 16;
l += ((long)b[3] & 0xFF) << 24;
这不可能对Java产生任何影响,因为没有(直接非API)将某些字节直接映射到Java中的int的方法。
每个执行此操作或类似操作的API都会精确地定义行为,因此您应该查找该API的文档。
我将一一读取字节,并将它们组合成一个长值。这样,您可以控制字节顺序,并且通信过程是透明的。
如果它符合您使用的协议,请考虑使用行为非常明确的DataInputStream 。
如上所述,Java是“大端”。这意味着如果您检查内存(至少在Intel CPU上),则int的MSB在左侧。对于所有Java整数类型,符号位也在MSB中。
从“ Little-endian”系统存储的二进制文件中读取4字节无符号整数需要用Java进行一些修改。DataInputStream的readInt()需要Big-endian格式。
这是一个将四个字节的无符号值(如HexEdit显示为01 00 00 00)读为值1的整数的示例:
// Declare an array of 4 shorts to hold the four unsigned bytes
short[] tempShort = new short[4];
for (int b = 0; b < 4; b++) {
tempShort[b] = (short)dIStream.readUnsignedByte();
}
int curVal = convToInt(tempShort);
// Pass an array of four shorts which convert from LSB first
public int convToInt(short[] sb)
{
int answer = sb[0];
answer += sb[1] << 8;
answer += sb[2] << 16;
answer += sb[3] << 24;
return answer;
}