【问题标题】:Translating from Java to C# a snippet of ByteBuffer code将 ByteBuffer 代码片段从 Java 转换为 C#
【发布时间】: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


【解决方案1】:

return ByteBuffer.wrap(new byte[]{hi, low}).getShort() 等同于:

return (short) (((hi & 0xFF) << 8) | (low & 0xFF));

该版本在 Java 和 C# 中是相同的。

【讨论】:

  • 这就像一个魅力!在等待的过程中,我还找到了另一个答案,我将把它作为原始帖子的更新发布。
  • @Nick 你“找到”了?我相信Sweeper found it适合你。
  • 你是对的,解决方案是基于 Sweeper 发布的链接。
【解决方案2】:

它在 C# 中非常简单。您可以在 C# 中使用两种方法

首先是

short sh = (short)((hi << 4) | low);

其次,您可以使用 Convert.To 函数,如下所示

sh =Convert.ToInt16((hi << 4) | low);

这个转换功能非常强大,有很多选项。也可以探索 BitConverter.ToInt16(byte[] array,int index)

以下是 C# 中控制台应用程序的工作代码

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace testBitConvertor
{
    class Program
    {
        static void Main(string[] args)
        {
            byte hi = 1;
            byte low = 1;

            // short sh = BitConverter.ToInt16(new byte(hi << 8) | low),1);
            short sh = (short)((hi << 4) | low);
            Console.WriteLine(sh);
            sh =Convert.ToInt16((hi << 4) | low);
            Console.WriteLine(sh);
            Console.ReadKey();
        }
    }
}

【讨论】:

    猜你喜欢
    • 2010-11-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-17
    • 1970-01-01
    • 2014-12-10
    相关资源
    最近更新 更多