Como converter um long
para um byte[]
e de volta em Java?
Estou tentando converter um long
para um byte[]
para poder enviar a byte[]
conexão TCP. Por outro lado, quero pegar isso byte[]
e convertê-lo novamente em um double
.
java
type-conversion
byte
long-integer
Emre801
fonte
fonte
Respostas:
Ou agrupado em uma classe para evitar a criação repetida de ByteBuffers:
Como isso está ficando tão popular, só quero mencionar que acho melhor você usar uma biblioteca como o Guava na grande maioria dos casos. E se você tiver alguma oposição estranha às bibliotecas, provavelmente considere esta resposta primeiro para soluções java nativas. Eu acho que a principal coisa que minha resposta realmente tem a oferecer é que você não precisa se preocupar com a continuidade do sistema.
fonte
Você pode usar os métodos de conversão de bytes do Google Guava .
Exemplo:
fonte
Testei o método ByteBuffer em operações simples de bit a bit, mas o último é significativamente mais rápido.
fonte
result |= b[i]
o valor do byte será primeiro convertido em longo, o que significa extensão de sinal. Um byte com o valor -128 (hex0x80
) se tornará longo com o valor -128 (hex0xFFFF FFFF FFFF FF80
). Primeiro após a conversão estão os valores ou: ed juntos. Usando bit a bit e protege contra esta convertendo primeiro o byte para um int e cortando a extensão de sinal:(byte)0x80 & 0xFF ==> (int)0xFFFF FF80 & 0xFF ==> (int) 0x80
. Por que bytes são assinados em java é um mistério para mim, mas acho que é para se encaixar em outros tipos.Se você está procurando uma versão rápida desenrolada, isso deve ser suficiente, assumindo uma matriz de bytes chamada "b" com um comprimento de 8:
byte [] -> longo
long -> byte [] como uma contraparte exata dos itens acima
fonte
Por que você precisa do byte []? por que não escrevê-lo no soquete?
Suponho que você queira dizer longo e não longo , o último precisa permitir valores nulos.
fonte
byte[]
é apenas um meio para esse fim.ByteBuffer
que, de acordo com os documentos "A ordem inicial de um buffer de bytes é sempre BIG_ENDIAN."Basta gravar o comprimento em um DataOutputStream com um ByteArrayOutputStream subjacente . No ByteArrayOutputStream, você pode obter a matriz de bytes via toByteArray () :
Funciona para outros primitivos de acordo.
Dica: para o TCP, você não precisa do byte [] manualmente. Você usará um soquete
socket
e seus fluxosem vez de.
fonte
Você pode usar a implementação em org.apache.hadoop.hbase.util.Bytes http://hbase.apache.org/apidocs/org/apache/hadoop/hbase/util/Bytes.html
O código fonte está aqui:
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
Procure os métodos toLong e toBytes.
Acredito que a licença do software permita que você pegue partes do código e o use, mas verifique isso.
fonte
fonte
Adicionarei outra resposta que seja a mais rápida possível ׂ (sim, até mais do que a resposta aceita), mas não funcionará em todos os casos. No entanto, funcionará para todos os cenários possíveis:
Você pode simplesmente usar String como intermediário. Observe que isso fornecerá o resultado correto, mesmo que pareça que o uso de String possa produzir resultados errados, desde que você saiba que está trabalhando com seqüências de caracteres "normais". Este é um método para aumentar a eficácia e tornar o código mais simples, que por sua vez deve usar algumas suposições nas cadeias de dados em que opera.
Para usar este método: Se você estiver trabalhando com alguns caracteres ASCII como esses símbolos no início da tabela ASCII, as seguintes linhas podem falhar, mas vamos ser sinceros - você provavelmente nunca os usará de qualquer maneira.
Profissional do uso desse método: lembre - se de que a maioria das pessoas geralmente trabalha com algumas seqüências normais, sem caracteres incomuns, e o método é o caminho mais simples e rápido.
de Longa para byte []:
de byte [] a Long:
fonte
Se você já estiver usando um
OutputStream
para gravar no soquete, o DataOutputStream pode ser uma boa opção. Aqui está um exemplo:Existem métodos semelhantes para
short
,int
,float
, etc. Você pode então usar DataInputStream no lado receptor.fonte
Com ByteBuffer.allocate (8) .putLong (obj) .array ():
Fonte:
Para muitos outros exemplos de uso do ByteBuffer:
fonte
Aqui está outra maneira de converter
byte[]
para olong
uso do Java 8 ou mais recente:A conversão de a
long
pode ser expressa como os bits de ordem alta e baixa de dois valores inteiros sujeitos a um OR bit a bit. Observe que otoUnsignedLong
é daInteger
classe e a primeira chamada paratoUnsignedLong
pode ser supérflua.A conversão oposta também pode ser desenrolada, como outros mencionaram.
fonte
Extensões Kotlin para os tipos Long e ByteArray:
Você pode ver o código completo em minha biblioteca https://github.com/ArtemBotnev/low-level-extensions
fonte