web-dev-qa-db-fra.com

Convertir un tableau long en octets et l'ajouter à un autre tableau

Je veux changer une valeur dans un tableau d'octets pour mettre une longue valeur d'horodatage dans les MSB. Quelqu'un peut-il me dire quelle est la meilleure façon de le faire? Je ne veux pas insérer de valeurs bit à bit, ce qui, à mon avis, 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-ce que quelque chose comme ça est possible. Quelle est la meilleure façon de modifier/insérer des valeurs dans ce tableau d'octets. puisque l'octet est une primitive, je ne pense pas que je puisse utiliser certaines implémentations directes?

Modifier:
Il semble que System.currentTimeMillis() soit plus rapide que Calendar.getTimeInMillis(), donc remplacez le code ci-dessus. Veuillez me corriger en cas d'erreur.

50
codeObserver

Il existe plusieurs façons de procéder:

  • Utilisez un ByteBuffer (meilleure option - concis et facile à lire):

    byte[] bytes = ByteBuffer.allocate(Long.SIZE / Byte.SIZE).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 (extrait du LongSerializer du code d'Hector) (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];
}
131
Bozho

Si vous voulez vraiment vous mettre à l'abri ...

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

Pour moi, ByteBuffer et d'autres utilitaires sont chers du point de vue du temps. Voici 2 méthodes que vous pouvez utiliser:

// première méthode (qui utilise la deuxième méthode), elle retourne le tableau alloué et rempli

public byte[] longToByteArray(long value) 
{
        byte[] array = new byte[8];

        longToByteArray(value,array,0);
        return array;
}

// cette méthode est utile si vous avez déjà alloué le tampon et que vous voulez écrire le long d'un emplacement spécifique dans le tableau.

public void longToByteArray(long value, byte[] array, int startFrom) 
{
    for (int i=7; i>=0; i--)
    {
        array[startFrom+7-i] = (byte) (value >> i*8);
    }
}
3
Colateral

Je mets à jour cet article car je viens d'annoncer une version préliminaire d'une bibliothèque qui convertira les longs en tableaux d'octets (et vice-versa). La bibliothèque est très petite et convertira toute primitive Java en 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 des tableaux longs en 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 longue.

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

N'hésitez pas à donner votre avis.

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

0
Coder Roadie

Il ne semble pas que vous puissiez découper un tableau d'octets pour insérer quelque chose dans un sous-ensemble sans le faire octet par octet. Regardez Prenez un segment d'un tableau dans Java sans créer un nouveau tableau sur le tas . Fondamentalement, ce que je ferais est de créer un tableau de 64 octets et de régler l'heure puis ajoutez-y un tableau vierge de 64 octets. Ou faites-le simplement octet par octet.

0
Matt Phillips