我在图书馆的设计中达到了一个点,我对字节序感到震惊 我可以很容易地处理字节的顺序,但是位的顺序在我的代码中引入了很大的复杂性。
我正在做的是将网络字节顺序(大端)中的uint
转换为字节
但是,我使用最重要的crumb(2位,从第一个[最重要]字节)用于其他东西,存储另一个数字。
通常情况下,我会使用这些行来书写和阅读碎屑:
bytes[0] |= 0xC0 // Writing 11 to the most significant crumb. It could be 10 or 01 too. Before the disjunction, I know those two bits are 0.
(bytes[0] & 0xC0) >> 6 // Getting the most significant crumb and shifting it to the right, in the least significant place.
对我来说,所有这些似乎都假设最重要的一点是第一位的
如果它没有,我的操作基本上会将00000011变成00001100,这不是我需要的值。
该数据存储在文件中,可以在其他地方访问。如果存储机器和读取机器使用不同的位顺序,读取器将变得垃圾。
我也不记得曾经读过一段对比特顺序做出反应的代码。
所以,我的问题是:我只是偏执狂,或者我的C#库可以在LSB第一台机器上使用吗? (在.NET或Mono下; Windows,Unix,Android,iOS等) 如果是这样,我怎样才能有效地处理可能性并能够正确检索我的2位数?
答案 0 :(得分:2)
因为你正在使用班次操作这样的东西:你很好。 Endianness不影响这些:它们在任何* -endian体系结构上的行为都相同 - 简单地说:它在内部的工作方式可能会在CPU之间发生变化,但是从常规代码中可以看出答案总是相同。
Endianness实际上只影响直接的值到字节的解释,例如使用unsafe
代码或BitConverter
来获取(或设置)int
或{{后面的原始字节1}},一个显式布局“union”结构,它与不同字段的字节重叠。如果您没有那种类型的东西,那么您不必担心CPU字节顺序。
答案 1 :(得分:1)
您不必担心比特顺序。但是这些位在CPU中处理,相应的位操作对外部工作相同。
当你向右移动时,总是朝向最不重要的位。如果最低有效位实际位于CPU内部的左侧,则物理位向左移位,但CPU外部的数字表示仍然是右侧最低有效位,并且运算符的含义是任何CPU都一样。
当你按位或使用0xC0
时,它与位的位置无关,因为值中的最高位和0xC0
中的最高位是相同的的地方。