2015-08-15 22 views
14

Ich habe meine eigene Klasse geschrieben, die C# -Standard-Primitive in Byte-Arrays umwandelt.Wie funktioniert die GetBytes-Funktion?

Später schaute ich mir die BitConverter Klasse source an, um zu sehen, wie Profis es gemacht haben.

Mein Codebeispiel:

public static byte[] getBytes(short value) { 
    byte[] bytes = new byte[2]; 

    bytes[0] = (byte)(value >> 8); 
    bytes[1] = (byte)value; 

    return bytes; 
} 

BitConverter Klassencode:

public unsafe static byte[] GetBytes(short value) 
{ 
    byte[] bytes = new byte[2]; 
    fixed(byte* b = bytes) 
     *((short*)b) = value; 
    return bytes; 
} 

Warum ihre Funktionen als unsicher markiert sind und Betreiber festgelegt verwenden?

Sind solche Funktionen fehleranfällig, auch wenn sie unsicher sind? Sollte ich einfach meine fallenlassen und ihre Implementierung verwenden? Was ist effizienter?

+3

Diese Funktionen machen verschiedene Dinge: Das erste verwendet Big Endian, das letzte native Endian. – CodesInChaos

Antwort

12

Ja, fallen Sie und verwenden Sie die Standardbibliothek.

Es ist effizienter, da es beide Bytes auf einmal kopiert, indem das Bytearray auf einen kurzen Zeiger umwandelt. Um dies zu tun, ist es erforderlich, die Verwendung von Zeigern und somit das unsichere Schlüsselwort zu erlauben.

Unsichere Codes sind in der Regel in Ihren eigenen Assemblies zu vermeiden, da dies bedeutet, dass Ihr Code nicht garantiert sicher ist und daher nur in vollständig vertrauenswürdigen Umgebungen ausgeführt werden kann.

Da Bitconverter jedoch Teil der Standard-.Net-Assemblys ist, die von Microsoft signiert sind, weiß Windows, dass sie in Ordnung sind.

Bibliotheksfunktionen sind auch weniger fehleranfällig, weil sie von Millionen von Entwicklern, die sie jeden Tag verwenden, gefestigt wurden, während Ihre Funktion nur von Ihnen getestet wurde.

+0

Macht Sinn, ich denke, ich sollte nur Wrapper um BitConverter-Klasse, wie GetBytes von String erstellen. – Scavs

+3

@Scavs Für 'String' sollten Sie' System.Text.Encoding.GetBytes' verwenden (https://msdn.microsoft.com/en-us/library/system.text.encoding.getbytes(v=vs.110) .aspx), nicht BitConverter. – Rotem

+0

Sie haben Recht, ich denke, ich sollte die "erfinde das Rad" -Sache schneiden. – Scavs