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();
ByteBufferKlasa została zaprojektowana dla tych brudnych rąk zadań chociaż. W rzeczywistości prywatny java.nio.Bitsdefiniuje te metody pomocnicze, które są używane przez ByteBuffer.putInt():
to działałoby dobrze, gdyby bufor bajtów już tam jest ... w przeciwnym razie wydaje się, że alokacja zajęłaby więcej czasu niż po prostu przydzielenie tablicy bajtów o długości 4 i przesunięcie ręcznie ... ale prawdopodobnie rozmawiamy o małych różnicach.
Jason S
Instancja ByteBuffer może być buforowana; i tak wewnętrznie jest na pewno zaimplementowany z przesuwaniem i maskowaniem.
Gregory Pakosz
4
To doskonała odpowiedź. Zauważ, że big-endian jest określoną wartością domyślną, a metody są „łańcuchowe”, a argument pozycji jest opcjonalny, więc wszystko redukuje się do: byte [] result = ByteBuffer.allocate (4) .putInt (0xAABBCCDD) .array ( ); Oczywiście, jeśli robisz to wielokrotnie i łączysz wszystkie wyniki razem (co jest powszechne, gdy robisz tego rodzaju rzeczy), przydziel pojedynczy bufor i wielokrotnie wstawFoo () do niego wszystkie potrzebne rzeczy - będzie śledzić przesunięcie w trakcie. To naprawdę niezwykle przydatne zajęcia.
Kevin Bourrillion
co to przynosi podpisanym typom?
Gregory Pakosz
3
Kto nie wie. PutInt zawsze zapisze 4 bajty, bez względu na rozmiar wejściowej liczby całkowitej. Jeśli chcesz tylko 2 bajty, użyj putShort, itd ...
bvdb
36
Używając BigInteger:
privatebyte[] bigIntToByteArray(finalint i ){BigInteger bigInt =BigInteger.valueOf(i);return bigInt.toByteArray();}
Używając DataOutputStream:
privatebyte[] intToByteArray (finalint i )throwsIOException{ByteArrayOutputStream bos =newByteArrayOutputStream();DataOutputStream dos =newDataOutputStream(bos);
dos.writeInt(i);
dos.flush();return bos.toByteArray();}
Używając ByteBuffer:
publicbyte[] intToBytes(finalint i ){ByteBuffer bb =ByteBuffer.allocate(4);
bb.putInt(i);return bb.array();}
@Pascal przy użyciu ByteBuffer Próbowałem z ByteBuffer bb = ByteBuffer.allocate (3); W tym celu daje java.nio.BufferOverflowException, nie rozumiem, dlaczego nie działa dla wartości mniejszej niż 4? Czy możesz wyjaśnić?
Sanjay Jain
@SanjayJain Otrzymujesz wyjątek od przepełnienia buforu, ponieważ wartości int w Javie mają rozmiar 32-bitowy lub 4 bajty, a zatem wymagają przydzielenia co najmniej 4 bajtów pamięci w ByteBuffer.
szokujące
@GregoryPakosz ma rację co do kolejności bajtów. Jego odpowiedź ByteBufferjest bardziej intuicyjna, jeśli masz do czynienia z int większym niż 2 ^ 31 - 1.
Nic też nie jest warte, że zadziała to niezależnie od najbardziej znaczącego bitu i będzie bardziej wydajne w porównaniu z innymi odpowiedziami. Można również użyć „>>”.
algolicious
1
Takie bezpośrednie rozwiązanie jest z pewnością szybsze niż wywołanie dowolnej metody bibliotecznej. Czasami musisz po prostu bawić się bitami bezpośrednio za pomocą kilku linii kodu, zamiast ponosić cały dodatkowy narzut wywołań metod bibliotecznych.
David R Tribble
I to dobrze konwertuje między językami, więc jest dobre do tworzenia oprogramowania w wielu językach.
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);
Zwracana tablica ma rozmiar wymagany do przedstawienia liczby, więc może mieć rozmiar 1, na przykład do reprezentowania 1. Jednak rozmiar nie może być większy niż cztery bajty, jeśli przekazywana jest wartość int.
From Strings:
BigInteger v =newBigInteger("AABBCCDD",16);byte[] array = v.toByteArray();
Musisz jednak uważać, jeśli pierwszy bajt jest wyższy 0x7F(tak jak w tym przypadku), gdzie BigInteger wstawiłby bajt 0x00 na początku tablicy. Jest to potrzebne do rozróżnienia wartości dodatnich i ujemnych.
dzięki! Ale skoro to jest BigInteger, czy ints będą się prawidłowo zawijać? Czy to liczby całkowite, które są poza Integer.MAX_VALUE, ale nadal można je przedstawić za pomocą tylko 4 bajtów?
Jaskier
1
Z pewnością nie jest to szybkie do wykonania. ;)
Peter Lawrey
To nie jest dobra opcja. Nie tylko może dodać bajt 0x00, ale może również usunąć zera wiodące.
ZZ Coder,
1
Proste rozwiązanie, które poprawnie obsługuje ByteOrder:
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);}}
Również Stringmetoda y:
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;}
Odpowiedzi:
Przyjrzyj się klasie ByteBuffer .
Ustawianie kolejności bajtów, zapewnia, że
result[0] == 0xAA
,result[1] == 0xBB
,result[2] == 0xCC
iresult[3] == 0xDD
.Lub możesz zrobić to ręcznie:
ByteBuffer
Klasa została zaprojektowana dla tych brudnych rąk zadań chociaż. W rzeczywistości prywatnyjava.nio.Bits
definiuje te metody pomocnicze, które są używane przezByteBuffer.putInt()
:źródło
Używając
BigInteger
:Używając
DataOutputStream
:Używając
ByteBuffer
:źródło
ByteBuffer
jest bardziej intuicyjna, jeśli masz do czynienia z int większym niż 2 ^ 31 - 1.użyj tej funkcji, która działa dla mnie
tłumaczy int na wartość bajtową
źródło
Jeśli lubisz guawę , możesz użyć jej
Ints
klasy:Do
int
→byte[]
użyjtoByteArray()
:Wynik jest
{0xAA, 0xBB, 0xCC, 0xDD}
.Jego odwrotność to
fromByteArray()
lubfromBytes()
:Wynik jest
0xAABBCCDD
.źródło
Możesz użyć
BigInteger
:Z liczb całkowitych:
Zwracana tablica ma rozmiar wymagany do przedstawienia liczby, więc może mieć rozmiar 1, na przykład do reprezentowania 1. Jednak rozmiar nie może być większy niż cztery bajty, jeśli przekazywana jest wartość int.
From Strings:
Musisz jednak uważać, jeśli pierwszy bajt jest wyższy
0x7F
(tak jak w tym przypadku), gdzie BigInteger wstawiłby bajt 0x00 na początku tablicy. Jest to potrzebne do rozróżnienia wartości dodatnich i ujemnych.źródło
Proste rozwiązanie, które poprawnie obsługuje ByteOrder:
ByteBuffer.allocate(4).order(ByteOrder.nativeOrder()).putInt(yourInt).array();
źródło
bardzo łatwe z systemem Android
źródło
To ci pomoże.
źródło
Może również przesuwać -
źródło
Oto metoda, która powinna dobrze wykonać zadanie.
źródło
To moje rozwiązanie:
Również
String
metoda y:źródło