2013-10-17 3 views
7

Ich verwende BitConverter.GetBytes(), um verschiedene Variablen (verschiedener Typen) in ein Bytearray umzuwandeln, um es an eine benutzerdefinierte Methode zu übergeben, wo ich den Wert jedes Bytes überprüfen muss.Warum 'BitConverter.GetBytes()' akzeptiert Argument des Typs 'Byte' und gibt immer ein 2-Byte-Array zurück?

Ich habe bemerkt, dass ich byte-BitConverter.GetBytes() eine Variable vom Typ passieren kann (auch wenn es nicht in der Überladungsliste aufgeführt ist: see related MSDN page) und in diesem Fall hat ich immer einen 2-Byte-Array als Rückgabewert. Sollte ich nicht ein Single-Byte-Array als Rückgabewert haben? Wie interpretiert .NET das Byteargument?

Probe:

byte arg = 0x00; 
byte[] byteArr = BitConverter.GetBytes(arg); 
// Result: byteArr is a 2-bytes array where byte[0] = 0 and byte[ 1] = 0 
+0

Die Probe mit 'arg interessanter sein würde! = 0x00' –

+1

Wie die Antworten besagt, sind Sie die Ergebnisse einer impliziten Umwandlung von' byte' zu ​​sehen "kurz". Hier ist die Liste der vordefinierten impliziten numerischen Konvertierungen in C#: http://msdn.microsoft.com/en-us/library/y5b434w4(v=vs.110).aspx –

+8

Die Framework-Designer gingen davon aus, dass Sie keine Konvertierung benötigen ein Byte zu einem Byte. –

Antwort

9

Wenn Sie GetBytes() sehen Sie werden feststellen, dass es keine Überlastung, die eine byte Parameter annimmt.

Sie betrachten die Ergebnisse der nächsten Übereinstimmung, GetBytes(Int16), und das produziert natürlich eine byte[2].

Mit anderen Worten: Ihr Code:

byte arg = 0x00; 
byte[] byteArr = BitConverter.GetBytes(arg); 

entspricht:

byte arg = 0x00; 
short _temp = arg; 
byte[] byteArr = BitConverter.GetBytes(_temp); 
1

Es ist eigentlich die Überlastung für short statt byte verwenden, die es bis Gießen Ihr Byte auf ein Mittel short, die 2 Bytes lang ist.

1

Es gibt keine Überlastung für GetBytes, die eine byte akzeptiert.

jedoch Abschnitt 6.1.2 der Sprache C# Spezifikation sagt, dass es eine implizite numerische Umwandlung

• Von Byte zu kurz, ushort, int, uint, long, ulong, float, double oder Dezimal.

Dies bewirkt, dass der Compiler die byte zu short konvertieren (die 2 Bytes), die das Verfahren führt zu einem 2-Byte-Array zurückzubringen.

3

Wie die anderen Antworten darauf hingewiesen haben, gibt es keine GetBytes-Überladung, die einen Byte-Parameter benötigt. Die nächste Frage ist, warum wählt sie die Überladung, die einen kurzen dauert. Es könnte eine dieser zum Beispiel wählen:

GetBytes(short) 
GetBytes(int) 
GetBytes(long) 
GetBytes(float) 
... 

Der Grund dafür, warum es kurz wählt, ist nicht nur, weil kurz die nächste nächste Sache ist. Es gibt bessere Gründe dahinter.Die C# -Sprachspezifikation erklärt:

"Gegeben eine implizite Konvertierung C1, die von einem Typ S in einen Typ T1 konvertiert, und eine implizite Konvertierung C2, die von einem Typ S in einen Typ T2 konvertiert, die bessere Konvertierung der beiden Konvertierungen wird wie folgt bestimmt „[1]

hier sind zwei mögliche Umsetzungen von S entweder T1 oder T2:

 S   
C1 byte  short (T1) 
C2 byte  int (T2) 

Die Regel, die hier arbeitet, ist:

“ Wenn von T1 eine implizite Konvertierung zu T2 existiert, und keine implizite co Es existiert eine Nversion von T2 nach T1, C1 ist die bessere Umwandlung. "

Es gibt eine implizite Konvertierung von short zu int, aber nicht von int zu short, daher wird die Konvertierung von Byte zu Short gewählt.

[1] http://msdn.microsoft.com/en-us/library/aa691339(v=vs.71).aspx (alte Kopie)

Verwandte Themen