Gibt es eine weniger schmerzhafte Art und Weise zu GetBytes für einen Puffer nicht bei 0 beginnen?

StackOverflow https://stackoverflow.com/questions/2527018

  •  22-09-2019
  •  | 
  •  

Frage

Ich habe mit rohem Bytes in einem Projekt zu tun und ich brauche im Grunde etwas zu tun, wie diese

byte[] ToBytes(){
  byte[] buffer=new byte[somelength];
  byte[] tmp;
  tmp=BitConverter.GetBytes(SomeShort);
  buffer[0]=tmp[0];
  buffer[1]=tmp[1];
  tmp=BitConverter.GetBytes(SomeOtherShort);
  buffer[2]=tmp[0];
  buffer[3]=tmp[1];
}

ich so das Gefühl ist so falsch aber ich kann keine bessere Möglichkeit, es zu tun finden. Gibt es einen einfacheren Weg?

War es hilfreich?

Lösung

Binary ist sehr effizient:

    byte[] ToBytes() {
        var ms = new MemoryStream(somelength);
        var bw = new BinaryWriter(ms);
        bw.Write(SomeShort);
        bw.Write(SomeOtherShort);
        return ms.ToArray();
    }

Andere Tipps

Sie brauchen nicht tmp in ein neues Array zu initialisieren. BitConverter.GetBytes erstellt ein neues Array und gibt es für Sie. Es gibt nicht viel können Sie über GetBytes tun, aber Sie können Methoden wie Buffer.BlockCopy simplify der Kopiervorgang.

Wenn Sie tun dies nicht in einem leistungskritischen Stück Code, können Sie ein wenig LINQy gehen und Dinge tun, wie:

IEnumerable<byte> bytes = BitConverter.GetBytes(first);
bytes = bytes.Concat(BitConverter.GetBytes(second));
bytes = bytes.Concat(BitConverter.GetBytes(third));
// ... so on; you can chain the calls too
return bytes.ToArray();

Wenn Sie die Größe vorher kennen (hat eine Reihe von Werttypen) können Sie eine Struktur verwenden könnten und Ihre Werte in der Struktur zuordnen. Dann unsafe Code verwenden, um das rohe Bytes zu kopieren. Ich würde immer noch davon abraten, wenn es für die Geschwindigkeit Zwecke wirklich notwendig ist. Und man könnte denken, es ist schmerzhaft:)

private struct MyStruct
{
    public short A;
    public short B;

    public MyStruct(short a, short b)
    {
        A = a;
        B = b;
    }
}

private unsafe byte[] UnsafeStruct(MyStruct myStruct)
{
    byte[] buffer = new byte[4]; // where 4 is the size of the struct
    fixed (byte* ptr = buffer)
    {
        *((MyStruct*)ptr) = myStruct;
    }
    return buffer;
}

Just Bit-Verschiebung ...

buffer[0]=(byte)SomeShort;
buffer[1]=(byte)(SomeShort >> 8);
buffer[2]=(byte)SomeOtherShort;
buffer[3]=(byte)(SomeOtherShort >> 8);

Das bedeutet auch, Sie in der vollständigen Kontrolle über die Bytereihenfolge ist (in diesem Fall, Little-Endian)

Sie können Ihren Code ein wenig kürzer unter Verwendung Array.Copy machen, aber keine gibt es keine GetBytes Überlastung oder gleichwertig in BitConverter dass puts die direkt in das Pufferbytes.

Vielleicht Binary auf eine < a href = "http://msdn.microsoft.com/en-us/library/system.io.memorystream.aspx" rel = "nofollow noreferrer"> Memory ist das, was Sie wollen?

Beachten Sie, dass die API-Konventionen von BitConverter durch die Annahme, die Sie nicht mögen, sind Sie das gleiche Problem für die Benutzer Ihrer Klasse zu verursachen. Verwenden Sie stattdessen eine Methode schreiben, die eine Binary akzeptiert und serialisiert die Klasse hinein, das sich gut, wenn Sie Ihre Klasse in einem anderen Objekt eingebettet ist.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top