java - programacion - Convierte long a byte array y agrégalo a otro array
manual de programacion android pdf (5)
Estoy actualizando esta publicación porque acabo de anunciar una versión preliminar de una biblioteca que convertirá largos a matrices de bytes (y viceversa). La biblioteca es muy pequeña y convertirá cualquier primitivo Java a una matriz de bytes.
http://rschilling.wordpress.com/2013/09/26/pre-release-announcement-pend-oreille/ http://code.google.com/p/pend-oreille/
Si lo usa, puede hacer cosas como convertir arrays largos a arrays de bytes:
Double[] doubles = new Double[1000];
for (int i = 2; i < 1002; i++) {
doubles[i - 2] = (double) i;
}
byte[] resultBytes1 = (byte[]) new PrimitiveHelper(PrimitiveUtil.unbox(doubles))
.asType(byte[].class);
También puede convertir un solo valor largo también.
byte[] resultBytes1 = (byte[]) new PrimitiveHelper(1000l)
.asType(byte[].class);
Siéntase libre de proporcionar algunos comentarios.
Actualización del 4 de octubre de 2013: ya he lanzado la producción de la biblioteca http://rschilling.wordpress.com/2013/10/04/pend-oreille-official-1-0-release/
Quiero cambiar los valores en una matriz de bytes para poner un valor de marca de tiempo largo en los MSB. ¿Puede alguien decirme cuál es la mejor manera de hacerlo? No quiero insertar valores bit a bit, lo que creo que es muy ineficiente.
long time = System.currentTimeMillis();
Long timeStamp = new Long(time);
byte[] bArray = new byte[128];
Lo que quiero es algo como:
byte[0-63] = timeStamp.byteValue();
Es algo así como posible. ¿Cuál es la mejor manera de editar / insertar valores en esta matriz de bytes? Ya que el byte es un elemento primitivo, ¿no creo que haya algunas implementaciones directas que pueda utilizar?
Editar:
Parece que System.currentTimeMillis()
es más rápido que Calendar.getTimeInMillis()
, por lo que reemplaza el código anterior por él. Corríjame si está mal.
Hay múltiples formas de hacerlo:
Use un
ByteBuffer
(la mejor opción: conciso y fácil de leer):byte[] bytes = ByteBuffer.allocate(Long.SIZE / Byte.SIZE).putLong(someLong).array();
También puede usar
DataOutputStream
(más detallado):ByteArrayOutputStream baos = new ByteArrayOutputStream(); DataOutputStream dos = new DataOutputStream(baos); dos.writeLong(someLong); dos.close(); byte[] longBytes = baos.toByteArray();
Finalmente, puede hacerlo manualmente (tomado del
LongSerializer
en el código de Hector) (más difícil de leer):byte[] b = new byte[8]; for (int i = 0; i < size; ++i) { b[i] = (byte) (l >> (size - i - 1 << 3)); }
Luego puede agregar estos bytes a su matriz existente mediante un simple bucle:
// change this, if you want your long to start from
// a different position in the array
int start = 0;
for (int i = 0; i < longBytes.length; i ++) {
bytes[start + i] = longBytes[i];
}
No parece que pueda dividir una matriz de bytes para insertar algo en un subconjunto sin hacerlo byte a byte. Mire Agarrar un segmento de una matriz en Java sin crear una nueva matriz en el montón . Básicamente, lo que haría sería configurar crear una matriz de 64 bytes y establecer el tiempo para luego agregarle una matriz de 64 bytes en blanco. O simplemente hacerlo byte por byte.
Para mí, ByteBuffer y otras herramientas son caras desde la perspectiva del tiempo. Aquí hay 2 métodos que puede utilizar:
// primer método (que usa el segundo método), devuelve la matriz asignada y cumplida
public byte[] longToByteArray(long value)
{
byte[] array = new byte[8];
longToByteArray(value,array,0);
return array;
}
// este método es útil si ya ha asignado el búfer y desea escribir una ubicación específica larga en la matriz.
public void longToByteArray(long value, byte[] array, int startFrom)
{
for (int i=7; i>=0; i--)
{
array[startFrom+7-i] = (byte) (value >> i*8);
}
}
Si realmente quieres meterte bajo el capó ...
public byte[] longToByteArray(long value) {
return new byte[] {
(byte) (value >> 56),
(byte) (value >> 48),
(byte) (value >> 40),
(byte) (value >> 32),
(byte) (value >> 24),
(byte) (value >> 16),
(byte) (value >> 8),
(byte) value
};
}