Comment puis-je convertir Long de byte[] et, de retour en java
Comment puis-je convertir une longue pour un byte[] et, de retour en Java?
Je suis en train de convertir une longue pour un byte[] de sorte que je vais être en mesure d'envoyer le byte[] sur une connexion tcp. De l'autre côté je veux prendre que byte[] et la convertir en un lit double.
Des conseils seraient appréciés.
- Une autre alternative sera de Cartes.transformValues, un général de l'outillage pour la conversion des collections. docs.guava-libraries.googlecode.com/git-history/release/javadoc/...
- Voir aussi stackoverflow.com/q/27559449/32453 si votre objectif est de convertir une longue dans le plus petit nombre de Base64 caractères.
- Peut-être qu'il convient de souligner que la conversion pipeline 'de long -> byte[] -> double", pas "long -> byte[] -> long -> double".
Vous devez vous connecter pour publier un commentaire.
Ou enveloppé dans une classe pour éviter à plusieurs reprises la création d'ByteBuffers:
Depuis c'est devenu tellement populaire, je veux juste mentionner que je pense que vous êtes mieux d'utiliser une bibliothèque comme la Goyave, dans la grande majorité des cas. Et si vous avez une étrange opposition à des bibliothèques, vous devriez probablement envisager cette réponse première pour java natif de solutions. Je pense que la principale chose que ma réponse a vraiment pour elle est que vous n'avez pas à vous soucier de la endian-ness de vous-même le système.
Vous pouvez utiliser le Octet méthodes de conversion de Google Goyave.
Exemple:
J'ai testé la ByteBuffer méthode contre plaine des opérations bit à bit, mais la seconde est beaucoup plus rapide.
Long.SIZE / Byte.SIZE
dans la gamme de taille et deByte.SIZE
en quart de travail.result |= b[i]
la valeur de l'octet va d'abord être converti à long terme qui ne l'extension du signe. Un octet dont la valeur -128 (hex0x80
) va se transformer 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'aide au niveau du bit et protège contre ce en convertissant d'abord l'octet de type int et le découpage de l'extension du signe:(byte)0x80 & 0xFF ==> (int)0xFFFF FF80 & 0xFF ==> (int) 0x80
. Pourquoi octets sont signés en java, c'est un peu un mystère pour moi, mais je suppose que c'est pour s'adapter à d'autres types.byte[] fileContent = Files.readAllBytes(path); long result = 0; for (int i = 0; i < Long.BYTES; i++) { result <<= Byte.SIZE; result |= (fileContent[i] & 0xFF); } System.out.println("The result: " + result);
Pourquoi avez-vous besoin byte[]? pourquoi ne pas l'écrire sur le socket?
Je suppose que vous voulez dire long plutôt que Long, celle-ci doit autoriser les valeurs null.
byte[]
est seulement un moyen à cette fin.ByteBuffer
qui, selon les docs "La première commande d'un octet de mémoire tampon est toujours BIG_ENDIAN.Si vous êtes à la recherche d'un rapide déroulé, cette version devrait faire l'affaire, en supposant un tableau d'octets appelé "b" avec une longueur de 8:
byte[] -> long
long -> byte[] comme un équivalent exact de la ci-dessus
Il suffit d'écrire le long d'un DataOutputStream avec un sous-jacent ByteArrayOutputStream. À partir de la ByteArrayOutputStream vous pouvez obtenir le tableau d'octets via toByteArray():
Fonctionne pour d'autres primitives en conséquence.
Conseil: Pour TCP vous n'avez pas besoin de le byte[] manuellement. Vous allez utiliser un Socket
socket
et de ses flux deà la place.
Vous pouvez utiliser la mise en œuvre dans org.apache.hadoop.hbase.util.Octets 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#Bytes.toBytes%28long%29
Recherchez le toLong et toBytes méthodes.
Je crois que la licence du logiciel vous permet de prendre des parties du code et de l'utiliser mais s'il vous plaît vérifier que.
Si vous utilisez déjà un
OutputStream
à écrire pour le socket, puis DataOutputStream pourrait être un bon ajustement. Voici un exemple:Il y a des méthodes similaires pour
short
,int
,float
, etc. Vous pouvez ensuite utiliser DataInputStream sur le côté de réception.Je vais ajouter une autre réponse qui est la plus rapide possible ׂ(oui, même plus que l'on a accepté la réponse), MAIS il ne fonctionne pas pour tous les cas. TOUTEFOIS, il ne fonctionne pour tous les scénarios envisageables:
Vous pouvez simplement utiliser la Chaîne comme intermédiaire. Remarque, cela vous donnera le résultat correct même s'il semble que l'aide de la Chaîne pourrait donner des résultats erronés aussi LONGTEMPS QUE vous SAVEZ que VOUS travaillez À la "NORMALE" des CHAÎNES. C'est une méthode pour augmenter l'efficacité et de rendre le code plus simple qui, en retour, doit utiliser certaines hypothèses sur les chaînes de données, il fonctionne sur.
Con de l'utilisation de cette méthode: Si vous travaillez avec certains caractères ASCII comme ces symboles dans le début de la table ASCII, les lignes suivantes peuvent échouer, mais avouons - le, vous n'aurez probablement jamais utiliser de toute façon.
Pro de l'utilisation de cette méthode: Rappelez-vous que la plupart des gens travaillent habituellement avec une certaine normale des cordes, sans caractères inhabituels et ensuite, la méthode est la plus simple et la plus rapide façon d'aller.
de Long à byte[]:
de byte[] pour Longtemps: