byte [8]到bits [64]解析

时间:2013-05-15 01:25:42

标签: c# binaryfiles bitconverter

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

1 个答案:

答案 0 :(得分:4)

假设字节是你的字节[8]。我们还要说字节是大端,意味着第一位是最重要的(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,0时结果为1,否则结果为1。只允许掩码中的1s传播,其他的将被删除。 00101101&0xF = 0000110100101101&0x1 = 00000001

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

在此处阅读C#运算符:http://msdn.microsoft.com/en-us/library/6a71f45d(v=vs.71).aspx

如果bytes是little endian,那么bit twiddling会有所不同。