java die Umwandlung von int zu short
Ich bin die Berechnung der 16 bit-Prüfsumme über meine Daten, die ich brauche zu senden an server, wo es neu berechnen und übereinstimmung mit der mitgelieferten Prüfsumme. Prüfsumme Wert, bin ich immer in int, aber ich habe nur 2 bytes für das senden der Wert.Also ich bin casting int
zu short
beim Aufruf shortToBytes
Methode. Dies funktioniert gut, bis zum checksum-Wert ist kleiner als 32767 danach bin ich immer negative Werte.
Sache ist java keine unsigned-primitiven, so bin ich nicht in der Lage zum senden von Werten größer als max-Wert des signierten short
erlaubt.
Wie kann ich dies tun, konvertieren von int zu short und über das Netzwerk senden, ohne sich Gedanken über das abschneiden und unterschrieben & unsigned int.
Auch auf der Seite hab ich das java-Programm läuft.
private byte[] shortToBytes(short sh) {
byte[] baValue = new byte[2];
ByteBuffer buf = ByteBuffer.wrap(baValue);
return buf.putShort(sh).array();
}
private short bytesToShort(byte[] buf, int offset) {
byte[] baValue = new byte[2];
System.arraycopy(buf, offset, baValue, 0, 2);
return ByteBuffer.wrap(baValue).getShort();
}
Du musst angemeldet sein, um einen Kommentar abzugeben.
Sind Sie noch immer die gleiche bit-Wert, als der server. So, um zu sehen den richtigen Zahlenwert ersetzen der
ByteBuffer.wrap(baValue).getShort()
zu einemByteBuffer.wrap(baValue).getInt()
. Dies sollte Ihnen den gleichen numerischen Wert hat wie der server.char
ist eine vorzeichenlose 16-bit-Typ. In der Tat ist es die einzige vorzeichenlose Datentyp in Java. Sie können es verwenden, für die Berechnung der Prüfsumme und dann mit einemByteBuffer
um die bytes oder verwenden Sie einfach bitweise und-Verknüpfung und rechts verschieben, um die bytes.Beachten Sie, dass
byte
s signiert sind.Erstens, Java
int
,short
undbyte
Typen sind alle signiert nicht unsigned. Zweitens, wenn Sie werfen eine Java -int
zu einemshort
, etc wird man ruhig abschneiden.Ob das geht, hängt von der Art der Prüfsummen-Algorithmus. Wenn es eine einfache Summe, oder einen bitweisen Algorithmus es gibt eine gute chance, dass der Algorithmus ist gut, wenn die Implementierung über Java-Ganzzahlen mit Vorzeichen. Zum Beispiel, diese "negativen" 16bit-Prüfsummen Stimmen könnte, wenn Sie interpretiert wird, indem Sie etwas erwarten, vorzeichenlose Werte.
Auf der anderen Seite, die semantische von Multiplikation und division sind, so dass signierte und unsignierte Aromen müssen separat behandelt werden. (Zumindest das ist, was ich zu schließen, von dem unwissenschaftlichen Ansatz der Blick auf die x86-Befehlssatz ... die hat separate Anweisungen für signed versus unsigned Multiplikation und division.)
BEARBEITEN ich verstehe, dass Sie die Berechnung der CRC-16. Da kann berechnet werden durch die Verlagerung und XORing, sollte es keine Bedenken unterzeichnet versus unsigned zahlen während der Berechnung.
Kurz gesagt, Sie haben nichts zu befürchten.
Wenn Sie sagen, dass Sie immer negative Werte, ich nehme an, du meinst, wenn du liest die 16-bit-Wert und konvertiert es in eine Ganzzahl. Der Grund dafür ist, dass Zeichen-Erweiterung bewirkt, dass das höchstwertige bit (das ist eine 1) werden repliziert, wenn die
short
erweitert wird um eineint
. Die einfache Lösung ist die bitweise und-Verknüpfung der rekonstruierten integer mit0xFFFF
, mit denen sichergestellt wird, dass nur die wenigstens einem 16-bits sind nicht null.