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();
Configuración garantiza el orden de bytes que result[0] == 0xAA, result[1] == 0xBB, result[2] == 0xCCy result[3] == 0xDD.
Sin ByteBufferembargo, la clase fue diseñada para tareas tan sucias. De hecho, lo privado java.nio.Bitsdefine estos métodos auxiliares que son utilizados por ByteBuffer.putInt():
esto funcionaría bien si el bytebuffer ya está allí ... de lo contrario, parece que tomaría más tiempo hacer la asignación, que solo asignar una matriz de bytes de longitud 4 y hacer el cambio manualmente ... pero probablemente estamos hablando sobre pequeñas diferencias
Jason S
La instancia de ByteBuffer se puede almacenar en caché; e internamente seguramente se implementa con desplazamiento y enmascaramiento de todos modos.
Gregory Pakosz
44
Esta es una respuesta perfectamente buena. Tenga en cuenta que big-endian es el valor predeterminado especificado, y los métodos son "encadenables", y el argumento de posición es opcional, por lo que todo se reduce a: byte [] result = ByteBuffer.allocate (4) .putInt (0xAABBCCDD) .array ( ); Por supuesto, si está haciendo esto repetidamente y concatenando todos los resultados juntos (lo cual es común cuando está haciendo este tipo de cosas), asigne un único búfer y ponga repetidamenteFoo () todas las cosas que necesita: hará un seguimiento del desplazamiento a medida que avanza. Realmente es una clase tremendamente útil.
Kevin Bourrillion
¿Qué aporta a los tipos firmados?
Gregory Pakosz
3
Para quien no sabe. PutInt siempre escribirá 4 bytes, sin importar el tamaño del entero de entrada. Si solo quieres 2 bytes, usa putShort, etc ...
bvdb
36
Utilizando BigInteger:
privatebyte[] bigIntToByteArray(finalint i ){BigInteger bigInt =BigInteger.valueOf(i);return bigInt.toByteArray();}
Utilizando DataOutputStream:
privatebyte[] intToByteArray (finalint i )throwsIOException{ByteArrayOutputStream bos =newByteArrayOutputStream();DataOutputStream dos =newDataOutputStream(bos);
dos.writeInt(i);
dos.flush();return bos.toByteArray();}
Utilizando ByteBuffer:
publicbyte[] intToBytes(finalint i ){ByteBuffer bb =ByteBuffer.allocate(4);
bb.putInt(i);return bb.array();}
@Pascal Usando ByteBuffer Intenté con ByteBuffer bb = ByteBuffer.allocate (3); Para esto, está dando java.nio.BufferOverflowException, no entiendo por qué no funciona con un valor inferior a 4. ¿Puede usted explicar por favor?
Sanjay Jain
@SanjayJain Obtiene una excepción de desbordamiento de búfer porque los ints en Java tienen un tamaño de 32 bits o 4 bytes y, por lo tanto, requieren que asigne al menos 4 bytes de memoria en su ByteBuffer.
impactante
@GregoryPakosz tiene razón sobre el orden de bytes. Su respuesta usando ByteBufferes más intuitiva si se trata de un int mayor que 2 ^ 31 - 1.
Tampoco vale la pena que esto funcione independientemente del bit más significativo y más eficiente en comparación con las otras respuestas. También podría usar '>>'.
algolicious
1
Una solución directa como esta es ciertamente más rápida que llamar a cualquier método de biblioteca. A veces solo tiene que jugar con los bits directamente con unas pocas líneas de código en lugar de incurrir en todos los gastos adicionales de las llamadas al método de la biblioteca.
David R Tribble
Y esto convierte bien entre idiomas, por lo que es bueno para el desarrollo de software en varios idiomas.
El coordinador el
15
Si te gusta la guayaba , puedes usar su Intsclase:
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);
La matriz devuelta es del tamaño que se necesita para representar el número, por lo que podría ser del tamaño 1, para representar 1, por ejemplo. Sin embargo, el tamaño no puede ser más de cuatro bytes si se pasa un int.
De cuerdas:
BigInteger v =newBigInteger("AABBCCDD",16);byte[] array = v.toByteArray();
Sin embargo, deberá tener cuidado, si el primer byte es mayor 0x7F(como en este caso), donde BigInteger insertaría un byte 0x00 al comienzo de la matriz. Esto es necesario para distinguir entre valores positivos y negativos.
¡Gracias! Pero como se trata de BigInteger, ¿los ints se ajustarán correctamente? ¿Son enteros que están fuera de Integer.MAX_VALUE pero que todavía se pueden representar con solo 4 bytes?
Buttercup
1
Esto ciertamente no es rápido de ejecutar. ;)
Peter Lawrey
Esta no es una buena opción. No solo puede agregar 0x00 bytes, también puede eliminar los ceros iniciales.
ZZ Coder
1
Solución simple que maneja adecuadamente ByteOrder:
Aquí hay un método que debería hacer el trabajo correctamente.
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);}}
También Stringy método:
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;}
Respuestas:
Echa un vistazo a la clase ByteBuffer .
Configuración garantiza el orden de bytes que
result[0] == 0xAA
,result[1] == 0xBB
,result[2] == 0xCC
yresult[3] == 0xDD
.O, alternativamente, puede hacerlo manualmente:
Sin
ByteBuffer
embargo, la clase fue diseñada para tareas tan sucias. De hecho, lo privadojava.nio.Bits
define estos métodos auxiliares que son utilizados porByteBuffer.putInt()
:fuente
Utilizando
BigInteger
:Utilizando
DataOutputStream
:Utilizando
ByteBuffer
:fuente
ByteBuffer
es más intuitiva si se trata de un int mayor que 2 ^ 31 - 1.usa esta función me funciona
traduce el int en un valor de byte
fuente
Si te gusta la guayaba , puedes usar su
Ints
clase:Para
int
→byte[]
, usetoByteArray()
:El resultado es
{0xAA, 0xBB, 0xCC, 0xDD}
.Su reverso es
fromByteArray()
ofromBytes()
:El resultado es
0xAABBCCDD
.fuente
Puedes usar
BigInteger
:De enteros:
La matriz devuelta es del tamaño que se necesita para representar el número, por lo que podría ser del tamaño 1, para representar 1, por ejemplo. Sin embargo, el tamaño no puede ser más de cuatro bytes si se pasa un int.
De cuerdas:
Sin embargo, deberá tener cuidado, si el primer byte es mayor
0x7F
(como en este caso), donde BigInteger insertaría un byte 0x00 al comienzo de la matriz. Esto es necesario para distinguir entre valores positivos y negativos.fuente
Solución simple que maneja adecuadamente ByteOrder:
ByteBuffer.allocate(4).order(ByteOrder.nativeOrder()).putInt(yourInt).array();
fuente
muy fácil con android
fuente
Esto te ayudara.
fuente
También puede cambiar
fuente
Aquí hay un método que debería hacer el trabajo correctamente.
fuente
Es mi solucion:
También
String
y método:fuente