将字节连接成整数或短保留符号

时间:2015-04-15 14:06:27

标签: c#

我知道我可以从int中提取字节:

bytes[] IntToBytes(int i)
{
  return new byte [] {(byte) ((i >> 8) & 0xff), (byte) (i & 0xff)};
}

我随后作为串行传输的一部分发送。但是,在收到字节序列后,我可以反过来重建原始数据,保留符号。目前,我这样做,但感觉有点过头了:

int BytesToInt( byte hi, byte lo)
{
  return ((hi << 24) | (lo << 16)) >> 16;
}

还有其他方式或更好的方法吗?如果我知道我最终只处理签名的16位数据会不会产生影响?

1 个答案:

答案 0 :(得分:2)

您只使用带符号的16位数据。那你为什么要传递(并返回)int而不是short?你丢弃了标志信息,所以它实际上不适用于负数。相反,使用short并且您会没事的 - 额外的类型信息将使您的代码更安全。

byte[] ShortToBytes(short i)
{
  return new byte [] {(byte) ((i >> 8) & 0xff), (byte) (i & 0xff)};
}

short BytesToShort(byte hi, byte lo)
{
  return unchecked((short)((hi << 8) | lo));
}

主要好处(除了更清晰,实际上工作)是您不能再向该方法传递无效值。这总是好的:)

哦,我建议保持接口对称 - BytesToShort也应该采用byte[](或其他具有两个字节的结构)。