当前位置:  开发笔记 > 编程语言 > 正文

Java是以小端还是大端读取整数?

如何解决《Java是以小端还是大端读取整数?》经验,为你挑选了4个好方法。

我问,因为我正在从C进程向Java发送字节流.在C端,32位整数的LSB是第一个字节,MSB是第4个字节.

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

一个后续问题:如果Java端的endian与发送的端不一样,我怎样才能在它们之间进行转换?



1> Egil..:

使用网络字节顺序(big endian),这与Java使用的相同.请参阅C中的不同翻译人员.



2> 小智..:

我在这里偶然发现了谷歌并得到了我的答案,即Java是大端.

通过阅读回答,我想指出字节确实有一个字节顺序,尽管如果你只处理"主流"微处理器,你不可能像英特尔,摩托罗拉和Zilog那样遇到它同意他们的UART芯片的移位方向,并且一个字节的MSB将是2**7并且LSB在他们的CPU中将是2**0(我使用FORTRAN功率符号来强调这个东西有多久:)).

20多年前,当我们用Mac计算机替换了价值10美元的接口硬件时,我遇到了一些航天飞机位串行下行链路数据.很久以前就有一篇关于它的NASA技术简报.在每个字节从位流中移入后,我只使用256元素查找表,其中位反转(表[0x01] = 0x80等).


使用某种形式的霍夫曼编码(即所有这些)的压缩格式也会产生按位字节序.为了更有趣,JPEG是"按位大端"(即最重要的位是"第一"位),LZ是"按位小端".我曾经使用过专有的压缩格式,它使用了两种格式.哦,那很有趣......

3> Jonas Elfstr..:

Java中没有无符号整数.所有整数都是签名的并且是大端的.

在C侧,每个字节的开头的LSB在左边,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;



4> Joachim Saue..:

这不可能影响Java中的任何东西,因为没有(直接的非API)方法将一些字节直接映射到Java中的int.

执行此操作或类似操作的每个API都非常精确地定义了行为,因此您应该查找该API的文档.


**+ 1**用于"查找文档",但**注意:**第一句话不再正确,因为现在NIO包提供了ByteBuffer,可以将字节映射到基元,并且您可以在哪里更改字节顺序.请参阅[ByteBuffer](http://download.oracle.com/javase/6/docs/api/java/nio/ByteBuffer.html)和[ByteOrder](http://download.oracle.com/javase/6/文档/ API/JAVA/NIO/ByteOrder.html)
但是如果你这样做,你仍然无法分辨你的JVM在内部使用什么endianess.
是的,但即使在那里你也没有直接映射.你正在使用的算法完全符合你所说的,没有歧义.在C中,您总是可以将"byte*"转换为"long*"并取消引用它.然后你必须关心endianess.在Java中,没有直接,模糊的方法来做到这一点.
哦,确定有.二进制数学(&,|,<<等)在字节和整数上运行得很好.获取任意字节并将它们粘贴到整数中非常容易.
推荐阅读
U友50081205_653
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有