c# - byte[8] 到 bits[64] 解析

标签 c# binaryfiles bitconverter

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

最佳答案

假设 bytes 是您的 byte[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。只允许掩码中的 1 传播通过,其他的将被删除。 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 则位旋转将不同。

关于c# - byte[8] 到 bits[64] 解析,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16555319/

相关文章:

c# - 要 float 的字节数组

c# - 8 字节数组返回长(C# 到 C++)

c# - 有什么好的 C# 代码生成器可以使用 oracle 存储过程吗?

c - 如何获取具有动态分配内容的结构的大小? (C)

c# - 如何从 C# 将对象设置为 C++

c++ - 如何在 C++ 中将二进制文件附加到二进制文件

apache-spark - PySpark:使用 binaryFiles() 函数读取二进制文件时进行分区

C# BitConverter 问题

c# - 比较字符串和 int 时,将它们都转换为字符串与将它们都转换为 int 有什么区别?

c# - 为什么在将 ApplicationCookie 与 ASP.Net Identity 一起使用之前调用 SignOut(DefaultAuthenticationTypes.ExternalCookie)?