2012-04-05 21 views
1

Versuchen, die Mathematik dieses Codeausschnitts zu verstehen. Es wird ein Token bereitgestellt, der immer 8 Ziffern hat. Es tritt in eine Klasse ein, die als lang typisiert ist. Das Token wird in separate Bytes aufgeteilt, die über einen Stream gesendet werden.Double Typ Casting ein Token

long token = 85838276; 

byte cp[] = { 
      1, 0, 0, 0, 0 
      }; 

cp[4] = (byte)(int)token; // not sure what would become of token 
cp[3] = (byte)(int)(token >> 8); 
cp[2] = (byte)(int)(token >> 16); 
cp[1] = (byte)(int)(token >> 24); 

Ich verstehe die Typumwandlung (Byte) Teil, aber nicht (Byte) (int) zusammen. Muss der Token, der vom Typ long ist, einen einfachen Typ nach dem anderen zurückgeben? Könnten Sie das (int) nicht auslassen und das gleiche Ergebnis haben?

Ist die Reihenfolge wichtig oder wird nur aus cp [4] in cp [1] geschrieben, um die Übersichtlichkeit zu erhöhen. Ich weiß, dass das Token in cp [4] nicht mit dem ursprünglichen Wert übereinstimmt, da der maximale Wert, den der Byte-Typ haben kann, 127 ist. Ist es möglich, das ursprüngliche Token wiederherzustellen, nachdem es sein Ziel erreicht hat?

Zuletzt möchte ich das in php neu erstellen. Ich weiß, dass eine Zeichenfolge bereits ein Byte-Stream ist. Jedes gesendete Zeichen wäre ein Byte. Muss ich eine Zeichenkette senden, wobei jedes Zeichen dem Ganzzahlwert entspricht, den es darstellt. Wie zum Beispiel nach der Antwort von Louis Wasserman, wird beim Typ in Byte umgewandelt nur das letzte Byte beibehalten.

Token in binary: 101000111011100100111000100 // cp[4] = 11000100 

Token shifted 08: 1010001110111001001 // cp[3] = 11001001 

Token shifted 16: 10100011101 // cp[2] = 00011101 

Token shifted 24: 101 // cp[1] = 101 

Antwort

3

Soweit ich das beurteilen kann, ist (byte) (int) entspricht (byte) in diesem Zusammenhang.

Das wäre nicht für alle Doppelabgüsse, aber es scheint hier wahr. Beide "verengen" Cast-Conversions.

+0

Was passiert also, wenn Sie eine Zahl eingeben, die größer ist als die für diesen Typ zulässige Höchstzahl? – jmm

+0

Für ganzzahlige Typen wird _truncated_: so daß '(int) longValue' nur die letzten vier Bytes des' longValue' nimmt und '(byte) intValue' das letzte Byte des' intValue'. So nimmt '(byte) (int) longValue nur das letzte Byte des' longValue'. –