将两个字节转换为一个字节,反之亦然

时间:2014-10-06 11:14:10

标签: c# binary byte

我需要开发两个函数来对字节进行组合和单独操作。

public byte Combine(Byte a, Byte b)
{
    // ... Operations ...
}

public byte[] Separate(Byte input)
{
    // ... Operations ...
}

public static void Main(String[] args)
{
    Byte a, b, c;
    a = <SOME BYTE VALUE>;
    b = <SOME OTHER BYTE VALUE>;

    Console.Writeline("Before Operation");
    Console.Writeline("a = " + Convert.ToString(a, 2));
    Console.Writeline("b = " + Convert.ToString(b, 2));

    // Combine Function called...
    c = Combine(a, b);

    // Separate Function called...
    byte[] d = Separate(c);

    a = d[0];
    b = d[1];

    Console.Writeline("After Operation");
    Console.Writeline("a = " + Convert.ToString(a, 2));
    Console.Writeline("b = " + Convert.ToString(b, 2));

    Console.ReadKey();
}

我尝试过很多事情,例如执行 AND,OR,XOR,NAND,NOT LEFT 的组合以及 RIGHT SHIFT 操作在此基础上实现上述功能。

我只是想知道有没有办法做到这一点,或者Wether首先编写这种类型的功能。

我需要你宝贵的建议和意见......

1 个答案:

答案 0 :(得分:1)

就像你在评论中看到的那样,你不能在1字节内存储2个字节。如果可以实现它,你可能会成为世界上最天才的人 - 每一个数据都可以被压缩两次!

相反,你可以在32位int中存储两个16位的int:

public static uint ToInt(ushort first, ushort second)
{
    return (uint)(first << 16) | second;
}

public static ushort ExtractFirst(uint val)
{
    return (ushort)((val >> 16) & ushort.MaxValue);
}

public static ushort ExtractSecond(uint val)
{
    return (ushort)(val & ushort.MaxValue);
}

接下来,我们可以将两个字节存储为一个16位int

public static ushort ToShort(byte first, byte second)
{
    return (ushort)((first << 8) | second);
}

public static byte ExtractFirst(ushort location)
{
    return (byte)((location >> 8) & byte.MaxValue);
}

public static byte ExtractSecond(ushort location)
{
    return (byte)(location & byte.MaxValue);
}