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();
Definir os garante ordem de bytes que result[0] == 0xAA, result[1] == 0xBB, result[2] == 0xCCe result[3] == 0xDD.
Ou, como alternativa, você pode fazer isso manualmente:
A ByteBufferaula foi projetada para tarefas com mãos sujas. De fato, o privado java.nio.Bitsdefine esses métodos auxiliares que são usados por ByteBuffer.putInt():
isso funcionaria bem se o bytebuffer já estivesse lá ... caso contrário, parece que levaria mais tempo para fazer a alocação, do que apenas alocar uma matriz de bytes de comprimento 4 e fazer a alteração manualmente ... mas provavelmente estamos falando sobre pequenas diferenças.
21713 Jason Jason S
A instância ByteBuffer pode ser armazenada em cache; e internamente é certamente implementado com mudanças e máscaras de qualquer maneira.
Gregory Pakosz 20/12/2009
4
Esta é uma resposta perfeitamente bem. Observe que big-endian é o padrão especificado, e os métodos são "encadeados" e o argumento de posição é opcional, portanto tudo se reduz a: byte [] result = ByteBuffer.allocate (4) .putInt (0xAABBCCDD) .array ( ); Obviamente, se você estiver fazendo isso repetidamente e concatenando todos os resultados juntos (o que é comum quando você está fazendo esse tipo de coisa), aloque um único buffer e coloque repetidamente oFofo () todas as coisas necessárias - ele acompanhará o deslocamento à medida que avança. É realmente uma aula tremendamente útil.
Kevin Bourrillion
o que traz tipos assinados?
Gregory Pakosz
3
Para quem não sabe. O putInt sempre escreverá 4 bytes, independentemente do tamanho do número inteiro de entrada. Se você quiser apenas 2 bytes, use putShort, etc ...
bvdb
36
Usando BigInteger:
privatebyte[] bigIntToByteArray(finalint i ){BigInteger bigInt =BigInteger.valueOf(i);return bigInt.toByteArray();}
Usando DataOutputStream:
privatebyte[] intToByteArray (finalint i )throwsIOException{ByteArrayOutputStream bos =newByteArrayOutputStream();DataOutputStream dos =newDataOutputStream(bos);
dos.writeInt(i);
dos.flush();return bos.toByteArray();}
Usando ByteBuffer:
publicbyte[] intToBytes(finalint i ){ByteBuffer bb =ByteBuffer.allocate(4);
bb.putInt(i);return bb.array();}
@ Pascal Usando ByteBuffer Eu tentei com ByteBuffer bb = ByteBuffer.allocate (3); Para isso, está dando java.nio.BufferOverflowException, não estou entendendo por que não está funcionando com valor menor que 4? Você pode explicar, por favor?
precisa saber é o seguinte
@SanjayJain Você recebe uma exceção de buffer overflow porque as entradas em Java têm tamanho de 32 bits ou 4 bytes e, portanto, exigem que você aloque pelo menos 4 bytes de memória no ByteBuffer.
chocante
@GregoryPakosz está certo sobre a ordem de bytes. Sua resposta usando ByteBufferé mais intuitivo se você está lidando com uma maior int que 2 ^ 31 - 1.
Também não vale nada que isso funcione, independentemente do bit mais significativo e mais eficiente em comparação com as outras respostas. Também pode usar '>>'.
algolicious
1
Uma solução direta como essa é certamente mais rápida do que chamar qualquer método de biblioteca. Às vezes, você só precisa mexer nos bits diretamente com algumas linhas de código, em vez de incorrer em toda a sobrecarga extra de chamadas de método de biblioteca.
David R Tribble
E isso converte bem entre idiomas, portanto, é bom para o desenvolvimento de software em vários idiomas.
O coordenador
15
Se você gosta de Guava , pode usar sua Intsclasse:
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);
A matriz retornada é do tamanho necessário para representar o número; portanto, pode ser do tamanho 1, para representar 1, por exemplo. No entanto, o tamanho não pode ser superior a quatro bytes se um int for passado.
From Strings:
BigInteger v =newBigInteger("AABBCCDD",16);byte[] array = v.toByteArray();
No entanto, você deve ter cuidado, se o primeiro byte for maior 0x7F(como neste caso), em que o BigInteger inserirá um byte 0x00 no início da matriz. Isso é necessário para distinguir entre valores positivos e negativos.
obrigado! Mas, como esse é o BigInteger, as ints serão agrupadas corretamente? Ou seja, números inteiros que estão fora do Integer.MAX_VALUE, mas ainda podem ser representados com apenas 4 bytes?
Buttercup
1
Isso certamente não é rápido de executar. ;)
Peter Lawrey
Esta não é uma boa opção. Além de adicionar 0x00 byte, também pode remover zeros à esquerda.
ZZ Coder
1
Solução simples que lida adequadamente com o ByteOrder:
Aqui está um método que deve fazer o trabalho da maneira certa.
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);}}
Também Stringmétodo 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;}
Respostas:
Dê uma olhada na classe ByteBuffer .
Definir os garante ordem de bytes que
result[0] == 0xAA
,result[1] == 0xBB
,result[2] == 0xCC
eresult[3] == 0xDD
.Ou, como alternativa, você pode fazer isso manualmente:
A
ByteBuffer
aula foi projetada para tarefas com mãos sujas. De fato, o privadojava.nio.Bits
define esses métodos auxiliares que são usados porByteBuffer.putInt()
:fonte
Usando
BigInteger
:Usando
DataOutputStream
:Usando
ByteBuffer
:fonte
ByteBuffer
é mais intuitivo se você está lidando com uma maior int que 2 ^ 31 - 1.use esta função que funciona para mim
traduz o int em um valor de byte
fonte
Se você gosta de Guava , pode usar sua
Ints
classe:Para
int
→byte[]
, usetoByteArray()
:Resultado é
{0xAA, 0xBB, 0xCC, 0xDD}
.O seu reverso é
fromByteArray()
oufromBytes()
:Resultado é
0xAABBCCDD
.fonte
Você pode usar
BigInteger
:De Inteiros:
A matriz retornada é do tamanho necessário para representar o número; portanto, pode ser do tamanho 1, para representar 1, por exemplo. No entanto, o tamanho não pode ser superior a quatro bytes se um int for passado.
From Strings:
No entanto, você deve ter cuidado, se o primeiro byte for maior
0x7F
(como neste caso), em que o BigInteger inserirá um byte 0x00 no início da matriz. Isso é necessário para distinguir entre valores positivos e negativos.fonte
Solução simples que lida adequadamente com o ByteOrder:
ByteBuffer.allocate(4).order(ByteOrder.nativeOrder()).putInt(yourInt).array();
fonte
muito fácil com android
fonte
Isso irá ajudá-lo.
fonte
Também pode mudar -
fonte
Aqui está um método que deve fazer o trabalho da maneira certa.
fonte
É a minha solução:
Também
String
método y:fonte