Java在其虚拟机中使用了什么字节顺序?我记得在哪里读取它取决于它运行的物理机器,然后我读到的其他地方,我相信它始终是大端。哪个是对的?
答案 0 :(得分:31)
class
文件中的多字节数据存储为big-endian。
来自The Java Virtual Machine Specification, Java SE 7 Edition,Chapter 4: The class
File Format:
一个类文件由一个流组成 8位字节。所有16位,32位和 64位数量由。构造 读两,四,八 分别为连续的8位字节。 始终存储多字节数据项 在大端的顺序,高的地方 字节排在第一位。
此外,字节码指令中的操作数如果跨越多个字节也是big-endian。
来自The Java Virtual Machine Specification, Java SE 7 Edition,Section 2.11: Instruction Set Summary:
如果操作数超过一个字节 大小,然后它存储在big-endian中 先订购高位字节。对于 例如,一个无符号的16位索引 局部变量存储为两个 无符号字节,
byte1
和byte2
等 它的值是(byte1 << 8) | byte2
。
是的,我认为可以说Java虚拟机使用的是big-endian。
答案 1 :(得分:18)
存储在正在运行的进程中的实际工作数据几乎肯定会与执行进程的字节顺序相匹配。通常,文件格式(包括类文件)将按网络顺序排列(大端)。
通常很难分辨机器在底下做什么,因为它被虚拟机抽象掉了。您无法在C和C ++中将short[]
强制转换为byte[]
。 java.nio.ByteOrder.nativeOrder()应该为您提供潜在的结束。使用非字节NIO缓冲区时,匹配的字节顺序非常有用。