【发布时间】:2020-06-26 03:57:52
【问题描述】:
我一直在尝试将以下 Java 代码翻译成 C#。
// two bytes to make a short (16 bit integer)
private short bytesToShort(byte hi, byte low) {
return ByteBuffer.wrap(new byte[]{hi, low}).getShort();
}
到目前为止,这是我通过四处搜索得到的结果:
private short bytesToShort(byte hi, byte low)
{
MemoryStream stream = new MemoryStream();
BinaryWriter writer = new BinaryWriter(stream);
writer.Write(hi);
writer.Flush();
writer.Write(low);
writer.Flush();
BinaryReader reader = new BinaryReader(stream);
return reader.ReadInt16();
}
但我收到 “无法在流结束后读取” 错误。在最后一个 writer.Flush(); 之后添加 stream.Position = 0; 可以解决该问题,但我得到的值不正确。我假设我对上述代码有更多问题,stream.Position = 0; 不是正确答案,即使它似乎可以解决问题。
有什么建议吗?
更新
我现在有两个可行的解决方案。第一个是 Andreas 在下面发布的答案:
return (short) (((hi & 0xFF) << 8) | (low & 0xFF));
它就像一个魅力,我认为在我拥有的两个解决方案中,这是更好的一个。 另一个是:
return BitConverter.ToInt16(new byte[2] { (byte)low, (byte)hi }, 0);
为了得到正确的结果,我不得不交换“low”和“hi”的位置。
重要! 对于从 Java 翻译到 C# 的人来说,Java 字节和 C# 字节之间有一个非常重要的区别。
Java 字节是有符号的,这意味着它的取值介于 -128 到 127 之间,但 C# 字节是无符号的,它的取值介于 0 到 255 之间。
如果你想在 C# 中使用 Java 签名字节,你必须使用 sbyte,这是一个我不知道的细节,它给我带来了问题。
【问题讨论】:
标签: java c# binary memorystream bytebuffer