单有符号字节整数位顺序似乎相反

时间:2018-08-06 02:33:35

标签: c# mono bit signed

我的c#Mono代码(小端操作系统)从该在线转换器以相反的顺序返回位,我不明白为什么:

http://www.binaryconvert.com/convert_signed_char.html

所述工具将-45渲染为11010011

我的逻辑将-45表示为11001011

我可以很容易地反转位顺序,但是我不知道是否应该这样做,因为我不想束缚逻辑,我想了解为什么会这样。似乎是LSB与MSB的比较,但我不明白为什么C#(或我的OS)选择一个或另一个。 little endian与这有什么关系吗?我认为这仅与字节顺序有关,与位顺序无关。还是我错了?

为什么?这是我的逻辑:

byte? sbOut = null;
sbyte sbIn = -45;

StaticHelpers.ConvertObjectTo8BitInt(
    sbIn,
    out sbOut
    );

BitArray baSignedByte = new BitArray(new byte[] { (byte)sbOut });

Console.WriteLine(
    string.Format("sbyte {0} bits {1}", sbIn, StaticHelpers.ToBitString(baSignedByte))
        );

public static class  StaticHelpers
{
    public static string ToBitString(this BitArray bits)
    {
        var sb = new StringBuilder();

        for (int i = 0; i < bits.Count; i++)
        {
            char c = bits[i] ? '1' : '0';
            sb.Append(c);
        }

        return sb.ToString();
    }

    public static void ConvertObjectTo8BitInt(
        object o,
        out byte? bOut
    )
    {
        bOut = new byte();

        if(o.GetType() == typeof(sbyte))
        {
            sbyte sbInput = (sbyte)o;

            try
            {
                bOut = unchecked((byte)sbInput);
            }
            catch (Exception ex)
            {
                throw new Exception(
                    "Failed to cast Signed Byte to byte",
                    ex
                );
            }
        }
        else if (o.GetType() == typeof(byte))
        {
            try
            {
                bOut = (byte)o;
            }
            catch (Exception ex)
            {
                throw new Exception(
                    "Failed to cast Byte",
                    ex
                );
            }
        }
        else
        {
            throw new Exception(
                "Failed to get sbyte or byte data type."
            );
        }
    }
}

1 个答案:

答案 0 :(得分:1)

请仔细阅读documentation

  

数组中的第一个字节代表位0到7,第二个字节代表位8到15,依此类推。每个字节的最低有效位代表最低索引值:“字节[0]和1”代表位0,“字节[0]和2”代表位1,“字节[0]和4”代表位2,并且等等。

也就是说,您BitArray中的位顺序是从最低有效位(LSB)最高有效位(MSB)。它与操作系统无关。