studio programacion para móviles libro edición desarrollo desarrollar curso aprende aplicaciones java bytearray type-conversion long-integer

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]; }



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 }; }