50 votes

Convertir long de tableau d'octets et de l'ajouter à un autre tableau

Je veux changer les valeurs dans le tableau d'octets pour placer une longue horodatage valeur dans les entreprises de transfert de fonds. Quelqu'un peut me dire quel est le meilleur moyen de le faire. Je ne veux pas insérer des valeurs de bit-par-bit, qui je crois est très inefficace.

long time = System.currentTimeMillis();
Long timeStamp = new Long(time);
byte[] bArray = new byte[128];

Ce que je veux, c'est quelque chose comme:

byte[0-63] = timeStamp.byteValue(); 

Est quelque chose comme cela possible . Quelle est la meilleure façon de modifier/insérer des valeurs dans ce tableau d'octets. depuis octet est une primitive je ne pense pas qu'il y a des implémentations, je peux utiliser?

Edit:
Il semble qu' System.currentTimeMillis() plus rapide que de l' Calendar.getTimeInMillis(), afin de remplacer le code ci-dessus par.Veuillez me corriger si mal.

132voto

Bozho Points 273663

Il y a plusieurs façons de le faire:

  • Utiliser un ByteBuffer (la meilleure option - concise et facile à lire):

    byte[] bytes = ByteBuffer.allocate(8).putLong(someLong).array();
    
  • Vous pouvez également utiliser DataOutputStream (plus détaillé):

    ByteArrayOutputStream baos = new ByteArrayOutputStream();
    DataOutputStream dos = new DataOutputStream(baos);
    dos.writeLong(someLong);
    dos.close();
    byte[] longBytes = baos.toByteArray();
    
  • Enfin, vous pouvez le faire manuellement (prises à partir de l' LongSerializer dans Hector code) (plus difficile à lire):

    byte[] b = new byte[8];
    for (int i = 0; i < size; ++i) {
      b[i] = (byte) (l >> (size - i - 1 << 3));
    }
    

Ensuite, vous pouvez ajouter ces octets à votre tableau existant par une simple boucle:

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

20voto

cr0ck3t Points 21

Si vous voulez vraiment sous le capot...

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

0voto

Matt Phillips Points 2607

Il ne semble pas que vous pouvez découper un tableau d'octets à insérer quelque chose dans un sous-ensemble sans faire octet par octet. Regardez java vous permettre de saisir un segment d'un tableau? . Fondamentalement, ce que je voudrais faire est de définir créer un 64 tableau d'octets et de régler le temps de lui, puis ajouter un blanc 64 tableau d'octets à elle. Ou tout simplement faire octet par octet.

0voto

Coder Roadie Points 38

Je mets à jour ce post parce que je viens d'annoncer une pré-version d'une bibliothèque qui vous permet de convertir aspire à des tableaux d'octets (et en arrière de nouveau). La bibliothèque est très petite et convertit toute primitif java à un tableau d'octets.

http://rschilling.wordpress.com/2013/09/26/pre-release-announcement-pend-oreille/ http://code.google.com/p/pend-oreille/

Si vous l'utilisez, vous pouvez faire des choses comme convertir long de tableaux de tableaux d'octets:

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

Vous pouvez également convertir une seule valeur de type long ainsi.

byte[] resultBytes1 = (byte[]) new PrimitiveHelper(1000l)
        .asType(byte[].class);

Hésitez pas à donner de la rétroaction.

Mise à jour le 4 octobre 2013: J'ai publié aujourd'hui la production de la bibliothèque http://rschilling.wordpress.com/2013/10/04/pend-oreille-official-1-0-release/

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X