Wie kann man Netzwerk-Byte-Order-Konvertierung von einem BinaryReader vereinfachen?


7

System.IO.BinaryReader liest Werte im Little-Endian-Format.

Ich habe eine C# -Anwendung, die auf der Serverseite eine Verbindung zu einer proprietären Netzwerkbibliothek herstellt. Die Server-Seite sendet alles wie erwartet in der Netzwerk-Byte-Reihenfolge herunter, aber ich finde, dass der Umgang damit auf der Client-Seite unangenehm ist, insbesondere für vorzeichenlose Werte.

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

ist der einzige Weg, ich habe kommen mit einem korrekten Wert ohne Vorzeichen aus dem Stream zu bekommen, aber dies scheint sowohl umständlich und hässlich, und ich habe noch zu testen, ob das wird gerade hoch abschneiden -order-Werte, damit ich BitConverter-Kram machen muss.

Gibt es eine Möglichkeit, die ich vermisse, einen Wrapper rund um das Ganze zu schreiben, um diese hässlichen Konvertierungen bei jedem Lesen zu vermeiden? Es scheint, als ob es eine Endian-Option für den Leser geben sollte, um solche Dinge einfacher zu machen, aber ich habe nichts gefunden.

  0

Funktioniert der ursprüngliche Code korrekt, wenn die Bytes eine native Ganzzahl darstellen können? 01 aug. 132013-08-01 17:58:30

  0

Es wird jetzt nicht helfen, aber ich habe ein [connect ticket] (https://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=484149) für BinaryRender/Writer erstellt, um Bigendian out the box zu unterstützen. Stimme dafür [hier] (https://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=484149). 25 aug. 092009-08-25 13:20:49

5

Es gibt keinen eingebauten Konverter. Hier ist meine Wrapper (wie Sie sehen können, habe ich nur die Funktionalität implementiert ich brauchte aber die Struktur ist ziemlich einfach nach Ihren Wünschen zu ändern):

/// <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; 
} 

Grundsätzlich ReadBigEndianBytes macht die Hauptarbeit, und dies ist eine bestandene Bitkonverter. Es wird ein bestimmtes Problem geben, wenn Sie eine große Anzahl von Bytes lesen, da dies eine große Speicherzuweisung verursacht.

  0

Hinweis: Array .Reverse() kehrt die Reihenfolge Ihres Arrays um. 24 jun. 162016-06-24 15:59:05


1

Ich baute einen benutzerdefinierten BinaryReader, um all dies zu behandeln. Es ist als part of my Nextem library verfügbar. Es hat auch eine sehr einfache Möglichkeit, binäre Strukturen zu definieren, von denen ich denke, dass sie Ihnen hier helfen werden - sehen Sie sich die Beispiele an.

Hinweis: Es ist nur in SVN jetzt, aber sehr stabil. Wenn Sie Fragen haben, senden Sie mir eine E-Mail an cody_dot_brocious_at_gmail_dot_com.

  0

Danke. Ich hoffte irgendwie, eine zusätzliche Bibliotheksabhängigkeit zu vermeiden, da diese ganze Sache wirklich ziemlich klein und einfach sein sollte, aber ich werde es mir merken. Schön, dass die Lizenz eindeutig ist. :) 23 sep. 082008-09-23 21:37:03

  0

Ah, ich verstehe. Nun, ich hoffe, es funktioniert für Sie, wenn Sie sich dafür entscheiden. Und ja, ich wurde aus genau diesem Grund Public Domain - ich möchte, dass die Leute absolut alles machen können, was sie wollen, und die Komponenten sind klein genug, um Patches zurück zu bekommen ist kein Problem :) 23 sep. 082008-09-23 21:39:34