Bir ikili ikili düzenleyiciden ağ bayt sırasını nasıl dönüştürebilirim?


7

System.IO.BinaryReader, değerleri küçük endian biçimde okur.

Sunucu tarafında özel bir ağ kitaplığına bağlanan bir C# uygulamasına sahibim. Sunucu tarafı, beklendiği gibi ağ bayt sırasına göre her şeyi gönderir, ancak istemci tarafında bununla uğraşmanın özellikle imzasız değerler için garip olduğunu buluyorum.

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

ben akışı dışına doğru işaretsiz değer elde etmek için birlikte geldim tek yoldur, ama bu garip ve çirkin hem görünüyor ve bu sadece kapalı yüksek klibi için gidiyor olmadığını test etmek henüz -değer değerler ben BitConverter şeyler yapmak zorundayım.

Her okumada bu çirkin dönüşümlerden kaçınmak için her şeyin etrafında bir sarıcı yazmanın kısa bir yolunu kaçırdığım bir yol var mı? Okuyucunun bu gibi şeyleri daha basit yapmak için bir endian-ness seçeneği olması gerektiği gibi görünüyor, ama hiçbir şeye rastlamadım.

  0

Orijinal kod, baytlar yerel bir tamsayıyı gösterdiğinde doğru çalışıyor mu? 01 ağu. 132013-08-01 17:58:30

  0

Şimdi yardımcı olmayacak, ancak kutuyu Bigendian'ı desteklemek için BinaryReder/Writer için bir [bağlantı bileti] (https://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=484149) oluşturdum. Bunun için oy verin [burada] (https://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=484149). 25 ağu. 092009-08-25 13:20:49

5

Yerleşik dönüştürücü yok.

Temelde
/// <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 homurtu çalışır ve bu geçirilir: İşte benim sarıcı (Gördüğünüz gibi, ben sadece gerekli işlevleri uygulanan ancak yapı beğeninize değiştirmek oldukça kolaydır) var BitConverter. Çok sayıda bayt okursanız, büyük bir bellek ayırmasına neden olacağından kesin bir sorun olacaktır.

  0

Not: Array .Reverse(), dizininizin sırasını yerinde tersine çevirir. 24 haz. 162016-06-24 15:59:05


1

Tüm bunları işlemek için özel bir BinaryReader oluşturdum. part of my Nextem library olarak kullanılabilir. Ayrıca burada size yardımcı olacağını düşündüğüm ikili yapıları tanımlamanın çok kolay bir yolu var - Örnekleri inceleyin.

Not: Şu anda yalnızca SVN'de, ancak çok kararlı. Herhangi bir sorunuz varsa, cody_dot_brocious_at_gmail_dot_com adresinden bana e-posta gönderin.

  0

Teşekkürler. Bir kütüphane bağımlılığı almaktan kaçınmayı çok istiyordum, çünkü bu şey gerçekten küçük ve basit olmalıydı, ama akılda tutmaya çalışacağım. Ehliyet görmek için güzel olsa da, belirsizdir. :) 23 eyl. 082008-09-23 21:37:03

  0

Ah, anlıyorum. Umarım seninle gitmeyi seçersen, senin için çalışır. Ve evet, sadece bu nedenden ötürü kamusal alana gittim - İnsanların istedikleri her şeyi yapabilmelerini istiyorum, ve bileşenler, parçaların geri dönmesini sağlayacak kadar küçük değil :) 23 eyl. 082008-09-23 21:39:34