Wie funktioniert BitConverter.ToInt32?

8

Hier ist eine Methode -

%Vor%

Ausgabe

16385 16385

Ich will nur wissen, wie das passiert?

    
user1027508 03.11.2011, 11:07
quelle

5 Antworten

12

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.

    
Jon Skeet 03.11.2011 11:12
quelle
4

Es konvertiert wie es eine Zahl in der Basis 256 war. Also in Ihrem Fall: 1 + 64 * 256 = 16385

    
Toto 03.11.2011 11:10
quelle
2

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:

%Vor%     
Brian 03.11.2011 14:48
quelle
0
  

Array [0] = 1; // Niedrigstes // 0x01
array [1] = 64; //   0x40
Array [2] = 0; // 0x00
Array [3] = 0; // Zeichenbit   0x00

Wenn Sie jeden Hexadezimalwert 0x00004001

kombinieren

Das MSDN-Dokument erklärt alles

    
Security Hound 03.11.2011 11:19
quelle
0

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%     
Zapnologica 23.11.2017 17:12
quelle

Tags und Links