2016-10-24 25 views
1

Ich bin mir nicht sicher, ob ich hier die richtige Frage stelle, aber ich möchte den Code von ReadInt64 wegen eines Endian-Experiments, das ich mache, manipulieren können. Der aktuelle Code ist dies:BinReader ReadInt64 außer Kraft setzen?

public virtual long ReadInt64() 
{ 
    FillBuffer(8); 
    uint lo = (uint)(m_buffer[0] | m_buffer[1] << 8 | 
        m_buffer[2] << 16 | m_buffer[3] << 24); 
    uint hi = (uint)(m_buffer[4] | m_buffer[5] << 8 | 
        m_buffer[6] << 16 | m_buffer[7] << 24); 
    return (long) ((ulong)hi) << 32 | lo; 
} 

Aber was ich will tun, die Zahlen meine eigene Art und Weise kippen. Ich könnte dies tun, indem ich in ein Bytearray einlese, aber das kostet Zeit und ich möchte lieber direkt mit m_buffer interagieren, damit die Zeit nicht verschwendet wird.

Das Problem ist, dass ich nicht weiß, wo ich anfangen soll. Ist es eine Vererbung oder ein Überschreiben, dass ich meine eigene ReadInt64 von einem geerbten Binärleser ausführen könnte? Ich weiß nicht, wie ich das schaffen soll und möchte einen Anstoss in die richtige Richtung geben.

Und, ja, ich lese zu diesem Thema, aber würde gerne hören, wenn mein Denken falsch ist.

Antwort

0

Da ReadInt64 mit dem Modifizierer virtual markiert ist, ist dies ein Hinweis für Sie, dass Sie erben und überschreiben können. Im Allgemeinen können Sie read the documentation for the class in question sicherstellen, dass es nicht sealed ist, was verhindern würde, dass Sie es erben und sehen, ob die in Frage stehenden Methoden virtuell sind.

public class MyBinaryReader : BinaryReader 
{ 
    public MyBinaryReader(Stream input) : base(input) 
    { 
    } 

    public MyBinaryReader(Stream input, Encoding encoding) : base(input, encoding) 
    { 
    } 

    public MyBinaryReader(Stream input, Encoding encoding, bool leaveOpen) : base(input, encoding, leaveOpen) 
    { 
    } 

    public override long ReadInt64() 
    { 
     // Fill in your own custom logic here. 
    } 
} 

Und wenn Sie wollen, es zu benutzen:

static void Main(string[] args) 
{ 
    // Just a dummy stream, for the sake of the example. 
    using (var inputStream = new MemoryStream()) 
    { 
     BinaryReader reader = new MyBinaryReader(inputStream); 
     long myValue = reader.ReadInt64(); 
    } 
} 
+0

Oh mein Wort. Es wird wirklich hier drüben. Danke vielmals. – mirk

+0

@mirk Sie sind willkommen. –

+0

Ich wette, ich könnte sogar meine eigene Methode so machen und dann nur den Code hineinkopieren, anstatt zu übersteuern, oder? öffentlich lang ReadInt64_MyWay() – mirk

Verwandte Themen