ByteBuffer b =ByteBuffer.allocate(4);//b.order(ByteOrder.BIG_ENDIAN); // optional, the initial order of a byte buffer is always BIG_ENDIAN.
b.putInt(0xAABBCCDD);byte[] result = b.array();
Einstellen der Byte - Reihenfolge wird sichergestellt , dass result[0] == 0xAA, result[1] == 0xBB, result[2] == 0xCCundresult[3] == 0xDD .
Die ByteBufferKlasse wurde jedoch für solche Aufgaben mit schmutzigen Händen entwickelt. Tatsächlich java.nio.Bitsdefiniert das Private diese Hilfsmethoden, die verwendet werden von ByteBuffer.putInt():
Dies würde gut funktionieren, wenn der Bytepuffer bereits vorhanden ist. Andernfalls scheint die Zuweisung länger zu dauern, als nur ein Byte-Array der Länge 4 zuzuweisen und die Verschiebung manuell durchzuführen. Aber wir sprechen wahrscheinlich über kleine Unterschiede.
Jason S
Die ByteBuffer-Instanz kann zwischengespeichert werden. und intern ist es sicherlich sowieso mit Verschieben und Maskieren implementiert.
Gregory Pakosz
4
Dies ist eine sehr gute Antwort. Beachten Sie, dass Big-Endian der angegebene Standardwert ist und die Methoden "verkettbar" sind und das Positionsargument optional ist. Daher reduziert sich alles auf: byte [] result = ByteBuffer.allocate (4) .putInt (0xAABBCCDD) .array ( ); Wenn Sie dies wiederholt tun und alle Ergebnisse miteinander verketten (was häufig der Fall ist, wenn Sie so etwas tun), weisen Sie natürlich einen einzelnen Puffer zu und setzen Sie wiederholt alle benötigten Dinge inFoo () ein - Es wird den Versatz verfolgen, während Sie gehen. Es ist wirklich eine unglaublich nützliche Klasse.
Kevin Bourrillion
Was bringt es auf signierten Typen?
Gregory Pakosz
3
Denn wer weiß es nicht. Das putInt schreibt immer 4 Bytes, unabhängig von der Größe der Eingabe-Ganzzahl. Wenn Sie nur 2 Bytes möchten, verwenden Sie putShort usw.
bvdb
36
Verwenden von BigInteger:
privatebyte[] bigIntToByteArray(finalint i ){BigInteger bigInt =BigInteger.valueOf(i);return bigInt.toByteArray();}
Verwenden von DataOutputStream:
privatebyte[] intToByteArray (finalint i )throwsIOException{ByteArrayOutputStream bos =newByteArrayOutputStream();DataOutputStream dos =newDataOutputStream(bos);
dos.writeInt(i);
dos.flush();return bos.toByteArray();}
Verwenden von ByteBuffer:
publicbyte[] intToBytes(finalint i ){ByteBuffer bb =ByteBuffer.allocate(4);
bb.putInt(i);return bb.array();}
@Pascal Mit ByteBuffer habe ich es mit ByteBuffer versucht bb = ByteBuffer.allocate (3); Dafür gibt es java.nio.BufferOverflowException, ich verstehe nicht, warum es nicht für einen Wert unter 4 funktioniert? Kannst du bitte Erklären?
Sanjay Jain
@SanjayJain Sie erhalten eine Pufferüberlaufausnahme, da Ints in Java 32 Bit oder 4 Byte groß sind und Sie daher mindestens 4 Byte Speicher in Ihrem ByteBuffer zuweisen müssen.
schockierend
@GregoryPakosz hat Recht mit der Bytereihenfolge. Seine Antwort mit ByteBufferist intuitiver, wenn Sie mit einem int größer als 2 ^ 31 - 1.
ordonezalex
31
Verwenden Sie diese Funktion, es funktioniert für mich
Es ist auch nichts wert, dass dies unabhängig vom wichtigsten Punkt funktioniert und im Vergleich zu den anderen Antworten effizienter ist. Könnte auch '>>' verwenden.
Algolicious
1
Eine direkte Lösung wie diese ist sicherlich schneller als das Aufrufen einer Bibliotheksmethode. Manchmal muss man nur mit ein paar Codezeilen direkt mit den Bits herumspielen, anstatt den zusätzlichen Aufwand für Bibliotheksmethodenaufrufe zu verursachen.
David R Tribble
Und dies konvertiert gut zwischen Sprachen und ist daher gut für die mehrsprachige Softwareentwicklung.
Der Koordinator
15
Wenn Sie Guave mögen , können Sie seine IntsKlasse verwenden:
int intValue =Ints.fromByteArray(newbyte[]{(byte)0xAA,(byte)0xBB,(byte)0xCC,(byte)0xDD});int intValue =Ints.fromBytes((byte)0xAA,(byte)0xBB,(byte)0xCC,(byte)0xDD);
Das zurückgegebene Array hat die Größe, die zur Darstellung der Zahl benötigt wird. Es kann also die Größe 1 haben, um beispielsweise 1 darzustellen. Die Größe darf jedoch nicht mehr als vier Byte betragen, wenn ein int übergeben wird.
Von Strings:
BigInteger v =newBigInteger("AABBCCDD",16);byte[] array = v.toByteArray();
Wenn das erste Byte höher ist 0x7F(wie in diesem Fall), müssen Sie jedoch darauf achten, dass BigInteger am Anfang des Arrays ein 0x00-Byte einfügt. Dies ist erforderlich, um zwischen positiven und negativen Werten zu unterscheiden.
Vielen Dank! Aber da dies BigInteger ist, werden Ints richtig herumlaufen? Das sind Ganzzahlen, die außerhalb von Integer.MAX_VALUE liegen, aber dennoch mit nur 4 Bytes dargestellt werden können?
Butterblume
1
Dies ist sicherlich nicht schnell auszuführen. ;)
Peter Lawrey
Dies ist keine gute Option. Es kann nicht nur 0x00 Byte hinzufügen, sondern auch führende Nullen entfernen.
Hier ist eine Methode, die den Job genau richtig machen sollte.
publicbyte[] toByteArray(int value){finalbyte[] destination =newbyte[Integer.BYTES];for(int index =Integer.BYTES -1; index >=0; index--){
destination[i]=(byte) value;
value = value >>8;};return destination;};
publicvoid getBytes(int val){byte[] bytes =newbyte[Integer.BYTES];for(int i =0;i < bytes.length; i ++){int j = val %Byte.MAX_VALUE;
bytes[i]=(j ==0?Byte.MAX_VALUE : j);}}
Auch Stringy Methode:
publicvoid getBytes(int val){String hex =Integer.toHexString(val);byte[] val =newbyte[hex.length()/2];// because byte is 2 hex charsfor(int i =0; i < hex.length(); i+=2)
val[i]=Byte.parseByte("0x"+ hex.substring(i, i+2),16);return val;}
Antworten:
Schauen Sie sich die ByteBuffer- Klasse an.
Einstellen der Byte - Reihenfolge wird sichergestellt , dass
result[0] == 0xAA
,result[1] == 0xBB
,result[2] == 0xCC
undresult[3] == 0xDD
.Alternativ können Sie dies auch manuell tun:
Die
ByteBuffer
Klasse wurde jedoch für solche Aufgaben mit schmutzigen Händen entwickelt. Tatsächlichjava.nio.Bits
definiert das Private diese Hilfsmethoden, die verwendet werden vonByteBuffer.putInt()
:quelle
Verwenden von
BigInteger
:Verwenden von
DataOutputStream
:Verwenden von
ByteBuffer
:quelle
ByteBuffer
ist intuitiver, wenn Sie mit einem int größer als 2 ^ 31 - 1.Verwenden Sie diese Funktion, es funktioniert für mich
es übersetzt das int in einen Bytewert
quelle
Wenn Sie Guave mögen , können Sie seine
Ints
Klasse verwenden:Für
int
→byte[]
verwenden SietoByteArray()
:Ergebnis ist
{0xAA, 0xBB, 0xCC, 0xDD}
.Seine Rückseite ist
fromByteArray()
oderfromBytes()
:Ergebnis ist
0xAABBCCDD
.quelle
Sie können verwenden
BigInteger
:Aus ganzen Zahlen:
Das zurückgegebene Array hat die Größe, die zur Darstellung der Zahl benötigt wird. Es kann also die Größe 1 haben, um beispielsweise 1 darzustellen. Die Größe darf jedoch nicht mehr als vier Byte betragen, wenn ein int übergeben wird.
Von Strings:
Wenn das erste Byte höher ist
0x7F
(wie in diesem Fall), müssen Sie jedoch darauf achten, dass BigInteger am Anfang des Arrays ein 0x00-Byte einfügt. Dies ist erforderlich, um zwischen positiven und negativen Werten zu unterscheiden.quelle
Einfache Lösung, die ByteOrder richtig handhabt:
ByteBuffer.allocate(4).order(ByteOrder.nativeOrder()).putInt(yourInt).array();
quelle
sehr einfach mit android
quelle
Das wird dir helfen.
quelle
Kann auch verschieben -
quelle
Hier ist eine Methode, die den Job genau richtig machen sollte.
quelle
Es ist meine Lösung:
Auch
String
y Methode:quelle