c# - 如何简化 BinaryReader 的网络字节顺序转换?

标签 c# .net networking

System.IO.BinaryReader 以小端格式读取值。

我有一个 C# 应用程序连接到服务器端的专有网络库。服务器端按照网络字节顺序发送所有内容,正如人们所期望的那样,但我发现在客户端处理这个问题很尴尬,尤其是对于无符号值。

UInt32 length = (UInt32)IPAddress.NetworkToHostOrder(reader.ReadInt32());

是我想出的从流中获取正确无符号值的唯一方法,但这看起来既笨拙又丑陋,而且我还没有测试这是否只是为了削减高阶值所以我必须做一些有趣的 BitConverter 事情。

除了围绕整个事物编写包装器以避免每次读取时出现这些丑陋的转换之外,我是否缺少某种方法?阅读器上似乎应该有一个字节序选项来使这样的事情变得更简单,但我还没有遇到任何事情。

最佳答案

没有内置转换器。这是我的包装器(如您所见,我只实现了我需要的功能,但结构很容易根据您的喜好进行更改):

/// <summary>
/// Utilities for reading big-endian files
/// </summary>
public class BigEndianReader
{
    public BigEndianReader(BinaryReader baseReader)
    {
        mBaseReader = baseReader;
    }

    public short ReadInt16()
    {
        return BitConverter.ToInt16(ReadBigEndianBytes(2), 0);
    }

    public ushort ReadUInt16()
    {
        return BitConverter.ToUInt16(ReadBigEndianBytes(2), 0);
    }

    public uint ReadUInt32()
    {
        return BitConverter.ToUInt32(ReadBigEndianBytes(4), 0);
    }

    public byte[] ReadBigEndianBytes(int count)
    {
        byte[] bytes = new byte[count];
        for (int i = count - 1; i >= 0; i--)
            bytes[i] = mBaseReader.ReadByte();

        return bytes;
    }

    public byte[] ReadBytes(int count)
    {
        return mBaseReader.ReadBytes(count);
    }

    public void Close()
    {
        mBaseReader.Close();
    }

    public Stream BaseStream
    {
        get { return mBaseReader.BaseStream;  }
    }

    private BinaryReader mBaseReader;
}

基本上,ReadBigEndianBytes 完成繁重的工作,并将其传递给 BitConverter。如果您读取大量字节,肯定会出现问题,因为这会导致大量内存分配。

关于c# - 如何简化 BinaryReader 的网络字节顺序转换?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/123918/

相关文章:

c# - system.uri' 不包含 'parsequerystring' 的定义

.net - 访问被拒绝在 Windows 7 上运行 sn.exe

android - 3G 连接设备和 WiFi PC 之间的 UDP

networking - 尝试登录laravel项目时504网关超时

c# - 如何从wcf获取业务异常?

c# - SignalR - 在不同的 Redis 背板之间切换

c# - 单击时部分选择 DataGridView 单元格的文本

.net - 是否有一个等效于 .net 的标准 Web 表单(不是 MVC)的 authorizeattribute

来自 C++ 客户端的 Java DataInputStream readInt() 获得了巨大的值(value)

c# - 通过Web.Config参数动态生成 View