将字节转换为位

Posted

技术标签:

【中文标题】将字节转换为位【英文标题】:converting Byte to bit 【发布时间】:2010-02-22 07:48:24 【问题描述】:

我目前正在开发visual c++ 2008 express edition。我的项目基于读取卫星图像并对其进行图像处理。 每个图像文件的格式为“.0FM”,大小为 8Mb。

到目前为止,我已经能够使用 FileStream 将文件(即 "*.0FM" )读取到 Byte 数组中,字节数组的大小为 8,000,000。

然后我将字节数组中的每个元素转换为十进制,所以现在数组中的每个元素的值都在 0 到 255 之间。 现在我必须将数组中的每个十进制值转换为其二进制值。 例如,86 应转换为 1010110

我真的被困在这里了。我尝试了System::Decimal::GetBits() 方法,但这个方法所做的只是将 86 存储到 bits[0] 中,

Decimal d = 86;
array<int>^ buf_bits = Decimal::GetBits(d);

此代码导致将值 86 存储在 buf_bits[0] 中,我没有得到 1010110。

【问题讨论】:

您能解释一下为什么需要这些位吗?看起来你在做一些很奇怪的事情。 【参考方案1】:

您永远不会直接使用这些位。将它们保留为字节。如果您需要检查标志或其他东西,请使用以下技术:

byte mask = 8;
if(myFileData[SomeIndex] & mask > 0)
   // Bit in 4th position is "ON";

【讨论】:

【参考方案2】:

首先,如果您的值介于 0 到 255 之间,则应使用字节(或无符号字符)。 比,您需要使用 Shift left / Shift right 运算符。

在伪代码中,其中 num 是您的 0-255 字节:

mask = 1b;
bits = new array[sizeof(BYTE)];
for (i=0; i < sizeof(BYTE); i++)

    tmp = num & mask;
    bits[i] = tmp >> i;
    mask = mask << 1;

【讨论】:

嗨..实际上我必须在图片框控件中显示这些字节值。所以,我想如果我将字节值转换为位,那么在图片框控件中显示字节值可能会很容易.. 在位数组中有 0 和 1。以您想要的任何方式使用它们。直接打印到图片框可能很困难,因为您需要一张图像,其像素代表图形 0 和 1。

以上是关于将字节转换为位的主要内容,如果未能解决你的问题,请参考以下文章

将字节数组转换为位集

通过连接将位(字节)存储在 long long 中

将任何文件加载到位并保存

将枢轴上的计数转换为位/标志?

在 C++ 中将字符或字符串转换为位集

我无法将 SQL 选择查询结果转换为位