Converter um flutuador em uma matriz de bytes em Java

Converter um flutuador em uma matriz de bytes em Java

1. Visão geral

Neste tutorial rápido, vamos explorar alguns exemplos de uso de Java para converter um float em uma matriz de bytes e vice-versa.

Isso é simples se convertermos uma matriz int ou longa em uma byte, pois os Operadores Java Bitwise funcionam apenas em tipos inteiros. No entanto, para um float, precisamos usar outra camada de conversão.

Por exemplo, podemos usar APIs fornecidas pela classethe Float ou classeByteBuffer do pacotejava.nio.

2. Conversão de matriz de flutuação em bytes

Como sabemos, o tamanho de um float em Java é de 32 bits, semelhante a um int. Portanto, podemos usar as funçõesfloatToIntBits or floatToRawIntBits disponíveis na classeFloat do Java. E então mude os bits para retornar uma matriz de bytes. Clique emhere para saber mais sobre as operações de deslocamento de bits.

A diferença entre ambos é quefloatToRawIntBits preserva também os valores Não-um-Número (NaN). Aqui, o deslocamento dos bits foi feito por meio de uma técnica chamadaNarrowing Primitive Conversion.

Em primeiro lugar, vamos dar uma olhada no código com a função de classe Float:

public static byte[] floatToByteArray(float value) {
    int intBits =  Float.floatToIntBits(value);
    return new byte[] {
      (byte) (intBits >> 24), (byte) (intBits >> 16), (byte) (intBits >> 8), (byte) (intBits) };
}

Em segundo lugar, uma maneira elegante de conversão usandoByteBuffer:

ByteBuffer.allocate(4).putFloat(value).array();

3. Conversão de matriz de bytes em flutuação

Vamos agora converter uma matriz de bytes em um float usando a função de classeFloatintBitsToFloat.

No entanto, precisamos primeiro converter uma matriz de bytes em bits int usando o deslocamento esquerdo:

public static float byteArrayToFloat(byte[] bytes) {
    int intBits =
      bytes[0] << 24 | (bytes[1] & 0xFF) << 16 | (bytes[2] & 0xFF) << 8 | (bytes[3] & 0xFF);
    return Float.intBitsToFloat(intBits);
}

Converter uma matriz de bytes em um float usandoByteBuffer é tão simples quanto isto:

ByteBuffer.wrap(bytes).getFloat();

4. Teste de Unidade

Vejamos casos de teste de unidade simples para implementação:

public void givenAFloat_thenConvertToByteArray() {
    assertArrayEquals(new byte[] { 63, -116, -52, -51}, floatToByteArray(1.1f));
}

@Test
public void givenAByteArray_thenConvertToFloat() {
   assertEquals(1.1f, byteArrayToFloat(new byte[] { 63, -116, -52, -51}), 0);
}

5. Conclusão

Vimos maneiras diferentes de conversão de float para byte e vice-versa.

A classeFloat fornece funções como uma solução alternativa para essa conversão. No entanto,ByteBuffer fornece uma maneira simples de fazer isso. Por esse motivo, sugiro usá-lo sempre que possível.

O código-fonte completo dessas implementações e casos de teste de unidade pode ser encontrado emGitHub project.