我知道我可以从int中提取字节,如下所示:
bytes[] IntToBytes(int i)
{
return new byte [] {(byte) ((i >> 8) & 0xff), (byte) (i & 0xff)};
}
Run Code Online (Sandbox Code Playgroud)
我随后作为串行传输的一部分发送.但是,在收到字节序列后,我可以反过来重建原始数据,保留符号.目前,我这样做,但感觉有点超过顶部:
int BytesToInt( byte hi, byte lo)
{
return ((hi << 24) | (lo << 16)) >> 16;
}
Run Code Online (Sandbox Code Playgroud)
还有其他方式或更好的方法吗?如果我知道我最终只处理签名的16位数据,它会有所作为吗?
您仅使用带符号的 16 位数据。那么为什么你传递(并返回) anint而不是 a 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));
}
Run Code Online (Sandbox Code Playgroud)
主要好处(除了更清晰和实际工作之外)是您不能再向该方法传递无效值。这总是好的:)
哦,我建议保持接口对称 -BytesToShort还应该采用 a byte[](或具有两个字节的其他结构)。