¿Cómo se convierte una long
a una byte[]
y de vuelta en Java?
Estoy tratando de convertir a long
a byte[]
para poder enviarlo a byte[]
través de una conexión TCP. Por otro lado, quiero tomar eso byte[]
y convertirlo nuevamente en a double
.
java
type-conversion
byte
long-integer
Emre801
fuente
fuente
Respuestas:
O envuelto en una clase para evitar crear repetidamente ByteBuffers:
Como esto se está volviendo tan popular, solo quiero mencionar que creo que es mejor usar una biblioteca como Guava en la gran mayoría de los casos. Y si tiene alguna oposición extraña a las bibliotecas, probablemente debería considerar esta respuesta primero para las soluciones nativas de Java. Creo que lo más importante que tiene mi respuesta es que no tiene que preocuparse por la endianidad del sistema usted mismo.
fuente
Puede utilizar los métodos de conversión de bytes de Google Guava .
Ejemplo:
fuente
Probé el método ByteBuffer contra operaciones simples a nivel de bit pero este último es significativamente más rápido.
fuente
result |= b[i]
el valor de byte se convertirá primero a largo, lo que sí firma la extensión. Un byte con valor -128 (hex0x80
) se convertirá en un largo con valor -128 (hex0xFFFF FFFF FFFF FF80
). Primero después de la conversión son los valores o: ed juntos. Uso de bit a bit-y protege contra esto convirtiendo primero el byte a un int y el corte de la extensión de signo:(byte)0x80 & 0xFF ==> (int)0xFFFF FF80 & 0xFF ==> (int) 0x80
. Por qué los bytes están firmados en Java es un poco misterioso para mí, pero supongo que encaja con otros tipos.Si está buscando una versión rápida desenrollada, esto debería funcionar, suponiendo una matriz de bytes llamada "b" con una longitud de 8:
byte [] -> largo
largo -> byte [] como contraparte exacta de lo anterior
fuente
¿Por qué necesitas el byte []? ¿Por qué no escribirlo en el zócalo?
Supongo que quiere decir largo en lugar de largo , este último debe permitir valores nulos.
fuente
byte[]
es solo un medio para ese fin.ByteBuffer
que, según los documentos "El orden inicial de un búfer de bytes es siempre BIG_ENDIAN.Simplemente escriba el largo en un DataOutputStream con un ByteArrayOutputStream subyacente . Desde ByteArrayOutputStream puede obtener la matriz de bytes a través de toByteArray () :
Funciona para otras primitivas en consecuencia.
Sugerencia: para TCP no necesita el byte [] manualmente. Usarás un Socket
socket
y sus flujosen lugar.
fuente
Puede usar la implementación en org.apache.hadoop.hbase.util.Bytes http://hbase.apache.org/apidocs/org/apache/hadoop/hbase/util/Bytes.html
El código fuente está aquí:
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
Busque los métodos toLong y toBytes.
Creo que la licencia de software le permite tomar partes del código y usarlo, pero verifíquelo.
fuente
fuente
Agregaré otra respuesta que sea la más rápida posible ׂ (sí, incluso más que la respuesta aceptada), PERO no funcionará en todos los casos. SIN EMBARGO, funcionará para cada escenario concebible:
Simplemente puede usar String como intermedio. Tenga en cuenta que esto le dará el resultado correcto a pesar de que parece que el uso de String podría producir resultados incorrectos MIENTRAS SABE QUE ESTÁ TRABAJANDO CON STRINGS "NORMALES". Este es un método para aumentar la efectividad y simplificar el código, que a cambio debe usar algunas suposiciones en las cadenas de datos en las que opera.
Contras de usar este método: si está trabajando con algunos caracteres ASCII como estos símbolos al comienzo de la tabla ASCII, las siguientes líneas pueden fallar, pero seamos sinceros, probablemente nunca las usará de todos modos.
Pro de usar este método: recuerde que la mayoría de las personas generalmente trabajan con algunas cadenas normales sin caracteres inusuales y luego el método es la forma más simple y rápida de hacerlo.
de Long a byte []:
del byte [] a Long:
fuente
Si ya está utilizando un
OutputStream
para escribir en el socket, DataOutputStream podría ser una buena opción. Aquí hay un ejemplo:Hay métodos similares para
short
,int
,float
, etc. A continuación, puede utilizar DataInputStream en el lado receptor.fuente
Con ByteBuffer.allocate (8) .putLong (obj) .array ():
Fuente:
Para muchos otros ejemplos de uso de ByteBuffer:
fuente
Aquí hay otra forma de convertir
byte[]
along
Java 8 o más reciente:La conversión de a
long
puede expresarse como los bits de orden alto y bajo de dos valores enteros sujetos a un OR por bits. Tenga en cuenta que eltoUnsignedLong
es de laInteger
clase y la primera llamada atoUnsignedLong
puede ser superflua.La conversión opuesta también se puede desenrollar, como han mencionado otros.
fuente
Extensiones Kotlin para tipos Long y ByteArray:
Puede ver el código completo en mi biblioteca https://github.com/ArtemBotnev/low-level-extensions
fuente