我正在使用 c# 读取二进制文件。文件类型的规范说有 6 个东西打包成一个字节 [8]。但是,它说第一个变量是 0-19 位。第二个变量 20-39,第三个 40-59,第四个 60-62 和 63 位是布尔值。如何将这些位转换为有意义的数据?除了最后一位之外,所有这些变量都是 uint。
问问题
400 次
1 回答
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 = 00000010
和00101101 << 4 = 11010000
&0x?
是位掩码。& 比较每一对位,只有当两个位都为 1 时结果为 1,否则为 0。只有掩码中的 1 将被允许传播,其他将被擦除。
00101101&0xF = 00001101
和00101101&0x1 = 00000001
(注:0xF 为 00001111,0x1 为 00000001)
在此处阅读有关 C# 运算符的信息:http: //msdn.microsoft.com/en-us/library/6a71f45d (v=vs.71).aspx
如果 bytes 是 little endian,那么 bit twiddling 会有所不同。
于 2013-05-15T01:36:48.433 回答