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


7

System.IO.BinaryReader以little-endian格式读取值。

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

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

是我想出来的,以获得正确的无符号数出流的唯一途径,但是这似乎既尴尬又丑,而且我还没有测试,如果这只是要剪掉高顺序值,以便我必须玩转BitConverter的东西。

有没有一些方法我错过了在整个事情中编写一个包装以避免在每次读取时都会发生这些丑陋的转换?看起来读者应该有一个endian-ness选项来让事情变得更简单,但我没有遇到任何问题。

  0

当字节可能表示一个本地整数时,原始代码是否正常工作? 01 8月. 132013-08-01 17:58:30

5

没有内置转换器。这里是我的包装(如你所看到的,我只实现我所需要的功能,但结构是很容易改变自己的喜好):

/// <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。如果您读取大量字节,将会有一个确定的问题,因为这会导致大量的内存分配。

  0

注意:Array .Reverse()会颠倒你阵列的顺序。 24 6月. 162016-06-24 15:59:05


1

我构建了一个自定义的BinaryReader来处理所有这些。它可作为part of my Nextem library。它也有一个定义二元结构的非常简单的方法,我认为这对你有帮助 - 查看例子。

注意:它现在只在SVN中,但非常稳定。如果您有任何问题,请发送电子邮件至cody_dot_brocious_at_gmail_dot_com。

  0

谢谢。我有点希望避免选择一个额外的库依赖项,因为这整个事情应该相当小和简单,但我会记住。很高兴看到许可证是明确的,但。 :) 23 9月. 082008-09-23 21:37:03

  0

啊,我明白了。那么,如果你选择使用它,我希望它对你有用。而且,因为这个原因,我进入了公有领域 - 我希望人们能够完成他们想做的任何事情,并且组件足够小以至于获得补丁不会有任何顾虑:) 23 9月. 082008-09-23 21:39:34