C# 字节[8]到位[64]解析

C# 字节[8]到位[64]解析,c#,binaryfiles,bitconverter,C#,Binaryfiles,Bitconverter,我正在用c#读取一个二进制文件。文件类型的规范说明,一个字节中包含6个内容[8]。然而,它说第一个变量是0-19位。第二个变量20-39、第三个变量40-59、第四个变量60-62和第63位为布尔值。如何将这些位转换为有意义的数据?除最后一位外,所有这些变量都是UINT 假设字节就是你的字节[8]。我们还假设字节是big-endian,这意味着第一位是最高有效位() 011234567 1111111111111111111222222222223333333333333333333444B i

我正在用c#读取一个二进制文件。文件类型的规范说明,一个字节中包含6个内容[8]。然而,它说第一个变量是0-19位。第二个变量20-39、第三个变量40-59、第四个变量60-62和第63位为布尔值。如何将这些位转换为有意义的数据?除最后一位外,所有这些变量都是UINT

假设字节就是你的字节[8]。我们还假设字节是big-endian,这意味着第一位是最高有效位()

011234567
1111111111111111111222222222223333333333333333333444B
int first=字节[0]4)&0xF;
int second=(字节[2]&0xF)1)&0x8;
bool标志=字节[7]&0x1==1?真:假;
基本上,我们在这里有两个主要业务:


将左操作数的位向左或向右移位右操作数的位数。所以
00101101>>4=00000010
00101101小尾端还是大尾端?小尾端是规范中所说的。噢,哇,非常感谢!!我最初尝试int first=(字节[0]|(字节[1]>>8)|(字节[2]>>16))&1048575;但你的更有意义@用户2383945只需验证
字节中的位压缩是否与您认为的一致。如果不是的话,逻辑就不同了。好吧,我仍然有一些问题,我想这是因为我需要用little endian来做。我必须反转位吗?@user2383945您可能必须反转字节、位或两者。看看你是否能找到正确的打包方式(如果你能用你想要的任何值生成这种格式的二进制文件,试着一次更改一位值,看看二进制文件中有什么变化,例如使用十六进制编辑器)
0        1        2        3        4        5        6        7
11111111 11111111 11112222 22222222 22222222 33333333 33333333 3333444B

int first = bytes[0] << 12 + bytes[1] << 4 + (bytes[2] >> 4)&0xF;
int second = (bytes[2]&0xF) << 16 + bytes[3] << 8 + bytes[4];
int third = bytes[5] << 12 + bytes[6] << 4 + (bytes[7] >> 4)&0xF;
int fourth = (bytes[7] >> 1)&0x8;
bool flag = bytes[7]&0x1 == 1 ? true : false;