我知道我可以从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位数据会不会产生影响?
答案 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[]
(或其他具有两个字节的结构)。