Hier ist eine Methode -
%Vor%Ausgabe
16385 16385
Ich will nur wissen, wie das passiert?
Die Dokumente für BitConverter.ToInt32
haben tatsächlich einige ziemlich gute Beispiele. Angenommen, BitConverter.IsLittleEndian
gibt wahr zurück, array[0]
ist das niedrigstwertige Byte. Wie Sie gezeigt haben ... obwohl array[3]
nicht nur das Vorzeichenbit ist, ist es das höchstwertige Byte, das das Vorzeichenbit enthält (als Bit 7), aber der Rest der Bits ist für Größe.
In Ihrem Fall ist also das niedrigstwertige Byte 1 und das nächste Byte 64 - also lautet das Ergebnis:
%Vor%Das ist 16385. Wenn das Vorzeichenbit gesetzt wäre, müssten Sie die beiden Fälle anders betrachten, aber in diesem Fall ist es einfach.
Wenn Sie die Referenzquelle .Net 4.0 Framework aufrufen, funktioniert BitConverter
wie Jons Antwort sagte, obwohl es Zeiger ( unsafe
code) verwendet, um mit dem Array zu arbeiten.
Wenn das zweite Argument (d. h. startindex
) jedoch durch 4 teilbar ist (wie in Ihrem Beispiel), nimmt das Framework eine Verknüpfung an. Es nimmt einen byte
-Zeiger auf das value[startindex]
, wandelt es in einen int
-Zeiger um und dereferenziert es dann. Dieser Trick funktioniert unabhängig davon, ob IsLittleEndian
wahr ist.
Von einer hohen Ebene bedeutet dies im Grunde genommen, dass der Code auf 4 Bytes im Array byte
zeigt und kategorisch deklariert, "das Stück Speicher dort ist ein int
!" (und dann eine Kopie davon zurückgeben). Dies macht durchaus Sinn, wenn man berücksichtigt, dass unter der Haube ein int
nur ein Stück Speicher ist.
Unten ist der Quellcode der Methode ToUint32
des Frameworks:
Array [0] = 1; // Niedrigstes // 0x01
array [1] = 64; // 0x40
Array [2] = 0; // 0x00
Array [3] = 0; // Zeichenbit 0x00
Wenn Sie jeden Hexadezimalwert 0x00004001
kombinierenDas MSDN-Dokument erklärt alles
Für diejenigen von euch, die Probleme mit Little Endien und Big Endien haben. Ich verwende die folgenden Wrapper-Funktionen, um darauf zu achten.
%Vor%Tags und Links c# bit-manipulation