lhi*_*onk 5 c# byte endianness bit
我正在努力让自己了解耐力和排序。
编辑:正如评论中指出的那样,字节顺序与我的问题无关,但我希望将其放在此处只是为了完整性。至少没有人与我的“定义”相矛盾。
到目前为止,我学到了什么:如果一个值(也许一个单词)由一个以上的字节(单词:2个字节)组成,则有两种不同的方法将该值保存在连续的内存块中。假设我们有一个十进制值43210(0xA8CA,1010100011001010)
BigEndian(第一个)保存字节,这将对较低地址的值大小产生更大的影响,这有点像我们编写普通的阿拉伯数字一样。
Memory address | 1000 | 1001
---------------|--------|---------
Bytes | A8 | CA
Run Code Online (Sandbox Code Playgroud)LittleEndian(第一个)保存字节,这将对较低地址的值大小产生较小的影响
Memory address | 1000 | 1001
---------------|--------|---------
Bytes | CA | A8
Run Code Online (Sandbox Code Playgroud)它是否正确?
我了解到的第二件事是,有两种不同的方法可以将一个字节的位保存在内存中(坚持使用43210 和 BigEndian):
类似于BigEndian,最高有效位(最前/最左边)保存字节,这些位首先在内存中对数值大小的影响最大,再次是:写阿拉伯数字时。
Memory address | 1000 | 1001
Bit values |128|64 |32 |16 |8 |4 |2 |1 |128|64 |32 |16 |8 |4 |2 |1 |
--------------------------------------------------------------------------------
Bits | 1 0 1 0 1 0 0 0 | 1 1 0 0 1 0 1 0
Run Code Online (Sandbox Code Playgroud)最低有效位(第一/左)反转字节中的位顺序,因此区分偶数和不均匀数的位首先出现
Memory address | 1000 | 1001
Bit values |1 |2 |4 |8 |16 |32 |64 |128|1 |2 |4 |8 |16 |32 |64 |128|
--------------------------------------------------------------------------------
Bits | 0 0 0 1 0 1 0 1 | 0 1 0 1 0 0 1 1
Run Code Online (Sandbox Code Playgroud)那也正确吗?
我的情况和问题来了:我正在通过网络接收数据。协议(Modbus)指定a)数据传输为BigEndian,并且当必须返回以字节包装的位时,MSB位于左侧,而LSB位于右侧。我正在使用C#、. Net 4.5进行编程。
在很多情况下,我都使用BitConverter类检查系统(BitConverter.IsLittleEndian)的耐久性,以通过NetSocket正确传递字值。
public static byte[] CorrectEndianess(byte[] in_byteArray)
{
if (BitConverter.IsLittleEndian)
return in_byteArray.Reverse().ToArray();
else return in_byteArray;
}
Run Code Online (Sandbox Code Playgroud)
当我收到一个包含八个位的字节(代表八个线圈(或输入)的状态)时,一切都会停止。根据定义,Modbus协议提供以下内容(示例):
Coil No. (example) | 27 | 26 | 25 | 24 | 23 | 22 | 21 | 20 |
-------------------|---------------------------------------|
Bits |MSB LSB|
Example values | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 |
Run Code Online (Sandbox Code Playgroud)
在byte包含此信息是在调试器示出为具有值“1”,这是很好的。但是,我需要每一位都为布尔值。C#提供了BitArray,我可以传递字节的类,该类返回bool[],对于我而言是理想的选择。
BitArray ba = new BitArray(new byte[1] { my_byte_which_is_of_value_1 });
Run Code Online (Sandbox Code Playgroud)
如果我打印BitArrays数组,则ba[0]包含该值true,其余为false。因此,我认为BitArray认为单个字节是LSB在前。这是奇怪的,因为它破坏了位,这预计(对于示例)的剩余处理ba[7]要true。
长话短说,这是我的主要问题:
如何检查in BitArray或in中假定的位顺序byte,因此我总是知道我的LSB和MSB在哪里?
在旁注中:从右至左记法语言的数字写成BigEndian对吗?
现在,经过几条评论后,我得到了我正在寻找的答案。如果我看得更仔细的话,我自己也会被绊倒的。
正如 @Alex Farber 所指出的,MSDN 指出 LSB 在 BitArray 中具有最低的索引。我也在这里找到了这个答案:https ://stackoverflow.com/a/9066924/1968308