Comment puis-je convertir un long
en a byte[]
et inversement en Java?
J'essaye de convertir un long
en unbyte[]
pour que je puisse envoyer le byte[]
via une connexion TCP. De l'autre côté, je veux prendre cela byte[]
et le reconvertir en un fichier double
.
java
type-conversion
byte
long-integer
Emre801
la source
la source
Réponses:
Ou enveloppé dans une classe pour éviter de créer à plusieurs reprises des ByteBuffers:
Étant donné que cela devient si populaire, je veux juste mentionner que je pense que vous feriez mieux d'utiliser une bibliothèque comme Guava dans la grande majorité des cas. Et si vous avez une étrange opposition aux bibliothèques, vous devriez probablement considérer cette réponse en premier pour les solutions Java natives. Je pense que l'essentiel de ma réponse est que vous n'avez pas à vous soucier vous-même de la finalité du système.
la source
Vous pouvez utiliser les méthodes de conversion Byte de Google Guava .
Exemple:
la source
J'ai testé la méthode ByteBuffer contre des opérations binaires simples, mais cette dernière est nettement plus rapide.
la source
result |= b[i]
la valeur d'octet sera d'abord convertie en long qui fait l'extension de signe. Un octet avec la valeur -128 (hex0x80
) se transforme en un long avec la valeur -128 (hex0xFFFF FFFF FFFF FF80
). Tout d'abord après la conversion sont les valeurs ou: ed ensemble. L' utilisation et protège bitwise contre cela en convertissant d' abord l'octet à un int et en coupant l'extension de signe:(byte)0x80 & 0xFF ==> (int)0xFFFF FF80 & 0xFF ==> (int) 0x80
. Pourquoi les octets sont signés en java est un peu un mystère pour moi, mais je suppose que cela convient à d'autres types.Si vous recherchez une version rapide déroulée, cela devrait faire l'affaire, en supposant un tableau d'octets appelé "b" avec une longueur de 8:
octet [] -> long
long -> byte [] comme contrepartie exacte de ce qui précède
la source
Pourquoi avez-vous besoin de l'octet []? pourquoi ne pas simplement l'écrire sur la socket?
Je suppose que vous voulez dire long plutôt que Long , ce dernier doit permettre des valeurs nulles.
la source
byte[]
est juste un moyen à cette fin.ByteBuffer
qui selon la documentation "L'ordre initial d'un tampon d'octets est toujours BIG_ENDIAN.Écrivez simplement le long dans un DataOutputStream avec un ByteArrayOutputStream sous-jacent . Depuis ByteArrayOutputStream, vous pouvez obtenir le tableau d'octets via toByteArray () :
Fonctionne pour les autres primitives en conséquence.
Astuce: pour TCP, vous n'avez pas besoin de l'octet [] manuellement. Vous utiliserez un Socket
socket
et ses fluxau lieu.
la source
Vous pouvez utiliser l'implémentation dans org.apache.hadoop.hbase.util.Bytes http://hbase.apache.org/apidocs/org/apache/hadoop/hbase/util/Bytes.html
Le code source est ici:
http://grepcode.com/file/repository.cloudera.com/content/repositories/releases/com.cloudera.hbase/hbase/0.89.20100924-28/org/apache/hadoop/hbase/util/Bytes.java# Octets.toBytes% 28long% 29
Recherchez les méthodes toLong et toBytes.
Je pense que la licence du logiciel vous permet de prendre des parties du code et de l'utiliser, mais veuillez le vérifier.
la source
la source
J'ajouterai une autre réponse qui est la plus rapide possible ׂ (oui, encore plus que la réponse acceptée), MAIS cela ne fonctionnera pas pour chaque cas. CEPENDANT, cela fonctionnera pour tous les scénarios imaginables:
Vous pouvez simplement utiliser String comme intermédiaire. Notez que cela vous donnera le résultat correct même s'il semble que l'utilisation de String puisse donner des résultats incorrects AUSSI QUE VOUS SAVEZ QUE VOUS TRAVAILLEZ AVEC DES CHAÎNES "NORMALES". C'est une méthode pour augmenter l'efficacité et rendre le code plus simple qui en retour doit utiliser certaines hypothèses sur les chaînes de données sur lesquelles il opère.
Contre d'utiliser cette méthode: si vous travaillez avec des caractères ASCII comme ces symboles au début de la table ASCII, les lignes suivantes peuvent échouer, mais avouons-le - vous ne les utiliserez probablement jamais de toute façon.
Pro de l'utilisation de cette méthode: rappelez-vous que la plupart des gens travaillent généralement avec des chaînes normales sans aucun caractère inhabituel et que la méthode est le moyen le plus simple et le plus rapide.
de Long à byte []:
de l'octet [] à Long:
la source
Si vous utilisez déjà un
OutputStream
pour écrire sur le socket, DataOutputStream peut être un bon choix . Voici un exemple:Il existe des méthodes similaires pour
short
,int
,float
, etc. Vous pouvez ensuite utiliser DataInputStream du côté de réception.la source
Avec ByteBuffer.allocate (8) .putLong (obj) .array ():
La source:
Pour de nombreux autres exemples d'utilisation de ByteBuffer:
la source
Voici une autre façon de passer
byte[]
à l'long
utilisation de Java 8 ou plus récent:La conversion de a
long
peut être exprimée comme les bits de poids fort et de poids faible de deux valeurs entières soumises à un OU au niveau du bit. Notez que letoUnsignedLong
est de laInteger
classe et le premier appel àtoUnsignedLong
peut être superflu.La conversion inverse peut également être déroulée, comme d'autres l'ont mentionné.
la source
Extensions Kotlin pour les types Long et ByteArray:
Vous pouvez voir le code complet dans ma bibliothèque https://github.com/ArtemBotnev/low-level-extensions
la source