C++ 比特流解析与Endianness

C++ 比特流解析与Endianness,c++,bit-shift,endianness,bitstream,C++,Bit Shift,Endianness,Bitstream,我试图解析一个比特流,但我在理解endianness时遇到了麻烦。我有一个字节缓冲区,我需要能够读出不同长度的位字段,大部分从1位到8位 我的问题是字节的尾数。当我逐步使用调试器时,底部的4位似乎位于字节的顶部。也就是说,我希望前两位是10(它们必须是10),但是,在使用调试器检查时,位流中的第一个字节是0xA3,或1010 0011。也就是说,假设位的顺序是“正确的”,前两位实际上是11(从右向左读取) 然而,如果这些位的顺序不正确,应该是0x3A或0011010,那么我的前两个位应该是10

我试图解析一个比特流,但我在理解endianness时遇到了麻烦。我有一个字节缓冲区,我需要能够读出不同长度的位字段,大部分从1位到8位

我的问题是字节的尾数。当我逐步使用调试器时,底部的4位似乎位于字节的顶部。也就是说,我希望前两位是10(它们必须是10),但是,在使用调试器检查时,位流中的第一个字节是0xA3,或1010 0011。也就是说,假设位的顺序是“正确的”,前两位实际上是11(从右向左读取)

然而,如果这些位的顺序不正确,应该是0x3A或0011010,那么我的前两个位应该是10

这让我很困惑,因为这似乎不是位顺序的问题,MSb到LSb/LSb到MSb,而是半字节顺序。这是怎么发生的?这似乎就是它从文件中出来的方式。有可能这是一个无效的比特流,但我以前在十六进制编辑器中读取文件时见过这种情况,看起来是以“错误”的顺序进行的


我只是有点困惑,想知道发生了什么。我不经常在这个级别处理事情。

您不需要关心位顺序,因为在C/C++中,您无法使用指针算术迭代位。您只能使用独立于本地机器的位顺序的位运算符来操作位。你在OP中提到的只是一个形象化的问题。不同的调试器可能会选择不同的方式来可视化字节中的位。这件事没有对错之分。这只是偏好。如果字节顺序非常重要。

据我所知,
0xA3
(即
10100011
)的前两个字节是
10
,然后是
100011
。我从未发现过半字节反转,endianness通常指字节顺序。在这里,我认为位顺序与您期望的相反。我认为我可能做得对,但其他方面出了问题。