字节[8]到位[64]的解析

本文关键字:到位 字节 | 更新日期: 2023-09-27 18:13:40

我正在使用c#阅读二进制文件。文件类型的规范说,一个字节中有6个东西[8]。然而,它说第一个变量是0-19位。第二个变量20-39,第三个变量40-59,第四个变量60-62,63位是布尔值。我如何将这些比特转换成有意义的数据?所有这些变量都是单位,除了最后一位。

字节[8]到位[64]的解析

假设bytes是字节[8]。我们还假设bytes是大端序,这意味着第一个位是最重要的(http://en.wikipedia.org/wiki/Endianness)

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;

基本上我们这里有两个主要的操作:

<<>>将左操作数的位向左或向右移动右操作数的位数。所以00101101 >> 4 = 0000001000101101 << 4 = 11010000

&0x?是位掩码。,比较每一对比特,只有当两个比特都为1时结果为1,否则为0。只有掩码里的15会被允许传播,其他的会被擦除。00101101&0xF = 0000110100101101&0x1 = 00000001

(注意:0xF为00001111,0x1为00000001)

阅读c#操作符:http://msdn.microsoft.com/en-us/library/6a71f45d(v=vs.71).aspx