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