我问这个问题是因为我正在将字节流从 C 进程发送到 Java。在 C 端,32 位整数的 LSB 是第一个字节,MSB 是第四个字节。

所以我的问题是:在 Java 端,当我们读取从 C 进程发送的字节时,什么是 字节序 在Java方面?

后续问题:如果Java端的字节序与发送的字节序不同,如何在它们之间进行转换?

有帮助吗?

解决方案

使用网络字节顺序(大端),其是相同的Java使用反正。见人htons在C中的不同的翻译。

其他提示

我偶然在这里通过谷歌,并得到我的回答,Java是大端。

通过阅读,我想指出的是字节确实有一个尾序的回应,虽然幸运的是,如果你只处理了“主流”微处理器你不可能遇到过它作为英特尔,摩托罗拉,和Zilog公司都同意他们的UART芯片的移动方向和一个字节的MSB将是2 ** 7和LSB会在他们的CPU(我用FORTRAN幂符号来强调这个东西有多老2 ** 0: ))。

我就遇到了这个问题,一些航天飞机,当我们更换为Mac电脑一个$ 10K接口硬件位串行下行数据超过20年前。有发表了一篇关于它前不久NASA技术简短。我只是用一个256个元素的查找表与反转(表[0×01] = 0x80的等)的每个字节从比特流中移位后。

的位

有在Java中没有无符号整数。所有整数签署并于大端。

  

在C面的每个字节都TNE LSB在开始是在左边和MSB末。

这听起来像你正在使用LSB为最显著位,是吗? LSB通常代表至少显著字节。 字节序是不位基于而是基于字节。

要从无符号字节转换为一个Java整数:

int i = (int) b & 0xFF;

要从无符号32位小端转换成字节[]到Java长(从我的头的顶部,未测试):

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是“大端”如上所述。这意味着,一个int的MSB在左边,如果你检查存储器(Intel CPU的至少上)。符号位也是在MSB所有Java整数类型。点击 从读通过“小端”系统存储二进制文件中的4字节无符号整数需要在Java中有点适应。 DataInputStream类的的readInt()预计big-endian格式。点击 下面是读取四个字节的无符号的值与值1(如为01 00 00 00显示由hexedit的)转换成一个整数的示例:

 // 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;        
 }
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top