11

我需要输入成对的字节并输出短路,并输入短路并输出成对的字节。以下是我为此目的设计的功能:

static short ToShort(short byte1, short byte2)
{
    short number = (short)byte2;
    number <<= 4;
    number += (short)byte1;
    return number;
}
static void FromShort(short number, out byte byte1, out byte byte2)
{
    byte byte2 = (byte)(number >> 4);
    short tempByte = (short)byte2 << 4;
    byte byte1 = (byte)(number - tempByte);
}

我认为这是正确的,但我不确定。如果这不是正确的做法,那是什么?有没有办法在框架中做到这一点?

4

5 回答 5

37

使用位转换器

short number = 42;
byte[] numberBytes = BitConverter.GetBytes(number);
short converted = BitConverter.ToInt16(numberBytes);
于 2009-09-18T04:42:15.870 回答
24

较短的版本(也移动 8 位而不是 4 位):

static short ToShort(short byte1, short byte2)
{
    return (byte2 << 8) + byte1;
}

static void FromShort(short number, out byte byte1, out byte byte2)
{
    byte2 = (byte)(number >> 8);
    byte1 = (byte)(number & 255);
}
于 2009-09-18T04:32:06.087 回答
5

字节是 8 位,而不是 4,所以你的移位是关闭的。您还在第二个函数中声明了局部变量,因此您最终不会out像您想要的那样编​​写参数。如果您尽可能将自己限制为按位运算( 、 和 ),它也会更清晰&/|更好~

static short ToShort(byte byte1, byte byte2)
{
    return (short) ((byte2 << 8) | (byte1 << 0));
}

static void FromShort(short number, out byte byte1, out byte byte2)
{
    byte2 = (byte) (number >> 8);
    byte1 = (byte) (number >> 0);
}

请注意,严格来说,左移和右移零是不必要的。我只是为了对称而把它们放进去。另外,我个人建议您只学习按位算术,并跳过编写这样的辅助函数。恕我直言,无需用如此基本的东西隐藏细节。

于 2009-09-18T04:31:45.153 回答
4

如果你想取字节……取字节;并且您的班次已关闭,并且|会更直观:

static short ToShort(byte byte1, byte byte2)
{   // using Int32 because that is what all the operations return anyway...
    return (short)((((int)byte1) << 8) | (int)byte2);
}
static void FromShort(short number, out byte byte1, out byte byte2)
{
    byte1 = (byte)(number >> 8); // to treat as same byte 1 from above
    byte2 = (byte)number;
}
于 2009-09-18T04:35:47.817 回答
0

System.BitConverter

于 2009-09-18T04:39:15.237 回答