【问题标题】:Does Java read a single byte in big endian bit order?Java是否以大端位顺序读取单个字节?
【发布时间】:2019-05-30 10:36:40
【问题描述】:

所以我们可以讨论位顺序和字节顺序的字节顺序。 例如,当我从 FileInputStream 读取下一个字节时,我实际上得到了一个 8 位有符号整数,但我不知道 Java 计算字节整数值的位顺序是什么。哪个在先,最高位还是最低位?

(符号位,2^6 ..... 2^0) 或者... (2^0, ..... 2^6, 符号位)

【问题讨论】:

  • 最左边的位代表符号,最右边的位是最不重要的。 0x80 = -128, 0x40 = 64, 0x20 = 32, 0x10 = 16, 0x08 = 8, 0x04 = 4, 0x02 = 2, 0x01 = 1, 0x00 = 0

标签: java byte endianness


【解决方案1】:

字节序仅在将一个单元分解为其他单元时才真正适用。因此,如果您通过位流传输一个字节,您可以观察最低有效位是先传输还是最后传输。那时我们可以说流是小端或大端。

但是在字节可寻址的机器中,即字节是最小的存储单元,字节内没有“字节序”。字节的任何位都“在”字节的任何其他位之前。

请注意,字节顺序的另一个术语是“字节顺序”。较大实体中的字节顺序。

确实,我们喜欢对位进行编号(0 到 7,对于 8 位字节),因此我们可以讨论它们,但这实际上并没有定义字节序,即使通常选择编号以匹配字节顺序机器的;这是约定。

关于 FileInputStream - 根据其文档,传输字节:字节的任何部分都不会在任何其他部分之前发送,至少就 FileInputStream 而言。如果字节必须通过某些互连(例如,SATA 电缆)按位发送,那么关于哪个位先发送的决定是硬件的问题。更高层的代码以字节(甚至块)为单位。

【讨论】:

  • 但除此之外,您所说的位“编号”实际上是存在的,对吧?我的意思是,在较低的水平上。文件是位于我的计算机上的可被 8 整除的有序位序列,或者不是?从数学上讲,如果我将 8 位转换为整数,将有两种计算其值的方法。一种方式是指数随位索引增加(从 0 开始),另一种方式是指数(从 7 开始)随着位索引增加而减小。对不对?
  • 在 CPU 中:整数值为 2^0 * minimum-sig-bit + 2^1 * next-sig-bit 等。位的含义是电子学中的问题铝。无论我们将最小信号位称为“0”还是“7”都不会改变电子设备。我不知道那个位在物理空间中的“位置”。在磁带上:一个字节的位很可能“跨”在磁带上,所以没有一个可以说是第一个。在磁盘上:我猜这些位是串行写入的,但不会暴露给磁盘的用户。在什么意义上你可以说文件中的一点是“第一”而不依赖于你用来显示它的软件?
  • 基本上我想确保的是,如果我在不同的操作系统上用不同的编程语言读取相同的字节,那么有符号的 8 位整数和无符号的 8 位整数的数值将不一样。例如,如果我有一个字节,其有符号值为 -128,无符号值为 +128(对于位序列 1000-0000),在特定编程语言的一个系统上,那么这些值对于任何系统和任何编程都保持不变语言。阅读有关不同位排序和位交换的信息并不乐观。
  • 那么你就可以了:一个字节只是一个字节。实际上,基于编程语言有一个附带条件,那就是您的八位单元是否被视为有符号或无符号。但不管怎样,它仍然是相同的 8 位。
【解决方案2】:

int中的第一位是符号,其余的是值,最后一位是最低有效位。

【讨论】:

  • 谢谢。那么这是否可以称为大端位序?
  • 字节序是关于一个值中的字节顺序,对于x86这是小端,在java中它也是小端,这意味着最不重要的byte在最后。这不是字节中的位顺序,而是字节顺序。
  • 好吧,但是在单个 Java 字节中,那么哪个是最重要的位? Java字节内的指数顺序是什么?
  • @PatrikNusszer 以字节为单位,最重要的位是 2^7 位。 ByteByte,除非你从某个流中一点一点地读取它,否则很明显哪个位是哪个 :)
猜你喜欢
  • 2011-11-03
  • 1970-01-01
  • 1970-01-01
  • 2014-10-13
  • 1970-01-01
  • 1970-01-01
  • 2010-09-26
  • 2019-09-24
  • 1970-01-01
相关资源
最近更新 更多