当前位置:  开发笔记 > 编程语言 > 正文

为什么在反转一个字节中的位时会得到以下输出?

如何解决《为什么在反转一个字节中的位时会得到以下输出?》经验,为你挑选了1个好方法。

假设:

将字节[]从Little Endian转换为Big Endian意味着反转byte []的每个字节中的位的顺序.

假设这是正确的,我尝试了以下内容来理解这一点:

byte[] data = new byte[] { 1, 2, 3, 4, 5, 15, 24 };
byte[] inverted = ToBig(data);

var little = new BitArray(data);
var big = new BitArray(inverted);

int i = 1;

foreach (bool b in little)
{
    Console.Write(b ? "1" : "0");
    if (i == 8)
    {
        i = 0;
        Console.Write(" ");
    }
    i++;
}

Console.WriteLine();

i = 1;

foreach (bool b in big)
{
    Console.Write(b ? "1" : "0");
    if (i == 8)
    {
        i = 0;
        Console.Write(" ");
    }
    i++;
}

Console.WriteLine();

Console.WriteLine(BitConverter.ToString(data));
Console.WriteLine(BitConverter.ToString(ToBig(data)));

foreach (byte b in data)
{
    Console.Write("{0} ", b);
}

Console.WriteLine();

foreach (byte b in inverted)
{
    Console.Write("{0} ", b);
}

转换方法:

private static byte[] ToBig(byte[] data)
{
    byte[] inverted = new byte[data.Length];

    for (int i = 0; i < data.Length; i++)
    {
        var bits = new BitArray(new byte[] { data[i] });
        var invertedBits = new BitArray(bits.Count);

        int x = 0;

        for (int p = bits.Count - 1; p >= 0; p--)
        {
            invertedBits[x] = bits[p];
            x++;
        }

        invertedBits.CopyTo(inverted, i);
    }

    return inverted;
}

这个小应用程序的输出与我的预期不同:

00000001 00000010 00000011 00000100 00000101 00001111 00011000

00000001 00000010 00000011 00000100 00000101 00001111 00011000 

80-40-C0-20-A0-F0-18

01-02-03-04-05-0F-18

1 2 3 4 5 15 24 

1 2 3 4 5 15 24 

由于某种原因,数据保持不变,除非使用BitConverter打印.

我不明白的是什么?

更新

新代码生成以下输出:

10000000 01000000 11000000 00100000 10100000 11110000 00011000 

00000001 00000010 00000011 00000100 00000101 00001111 00011000 

01-02-03-04-05-0F-18

80-40-C0-20-A0-F0-18

1 2 3 4 5 15 24 

128 64 192 32 160 240 24 

但正如我现在被告知的那样,我的方法无论如何都是错误的,因为我应该反转字节而不是位?

我正在使用的硬件开发人员告诉我要反转这些位,因为他无法读取数据.

我正在使用它的上下文

将使用它的应用程序并不真正适用于数字.

我应该保存一个位流来存档

1 =白色,0 =黑色.

它们表示位图256x64的像素.

字节0到字节31表示第二行像素的第一行像素字节32到字节63.

我有输出这些位的代码......但开发人员告诉我他们的顺序错误......他说字节很好但是位不是.

所以我感到困惑:p



1> greyfade..:

否.字节顺序是指字节的顺序,而不是位.大端系统首先存储最重要的字节,而小端系统首先存储最不重要的字节.一个字节内的位保持相同的顺序.

看起来你的ToBig()函数正在返回原始数据而不是位交换数据.

推荐阅读
落单鸟人
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有