Long, codificado em byte[]

5 respostas
RicardoCobain

Olá Galera, estou com um problemilha chato…

Eu quero saber como posso converter 1 numero longo para uma Array de Bytes;
E tambem depois conver o array de Bytes para Long…

Eu até consegui fazer, o problema é quando entram numeros negativos na historia.

Eu sei que numetos binarios negativos, tem que fazer "uma onda" ai pra representalos, mas n tenho a menor ideia de como fazer…
Peço que alguem me de uma LUZ nesse problema.

Ex:

public class NewClass {

    public static void main(String[] args) {
//        byte[] valRecebido = new byte[]{ // Valore recebido....;
//            68, 66, -43, -2
//        };

        long valorEnviado = -19578300L; // Valor enviado.
        long valorEnviado2 = 19578300L; // Valor enviado.

        System.out.println("Valor enviado em bytes:" + valorEnviado);
        byte[] veBytes = longToBytes(valorEnviado);
        for (int i = 0; i < veBytes.length; i++) {
            System.out.print("" + veBytes[i] + ", ");
        }
        
        System.out.println("\n getLong = " + getLong(veBytes, 0, 4));
        
        // Agora o Positivo
         System.out.println("Valor enviado em bytes:" + valorEnviado2);
        veBytes = longToBytes(valorEnviado2);
        for (int i = 0; i < veBytes.length; i++) {
            System.out.print("" + veBytes[i] + ", ");
        }  
       
        System.out.println("\n getLong = " + getLong(veBytes, 0, 4));        

    }

    public static byte[] longToBytes(long l) {
        byte[] data = new byte[4];
        for (int i = data.length - 1; i >= 0; i--) {
            data[i] = (byte) (l & 0xFF);
            l >>= 8;
        }

        return data;
    }

    public static long getLong(byte[] data, int offset, int length) {
        long l = 0;
        int i = 0;
        while (i < length) {
            l <<= 8;
            l += data[offset + i] & 0xFF;
            i++;
        }
        return l;
    }
}

5 Respostas

T

O seu código está quase certo, exceto por você ter de usar “>>>=” em vez de “>>=”.

RicardoCobain

Vc diz na função longToBytes ? , Teitei e n mudou nada.
O erro provavelmente deve tar na função: getLong

T

Atenção - um long tem 8 bytes, não 4. Cuidado!
Se você quer converter um int (4 bytes) para bytes, vai dar, olhando pela calculadora do Windows:

-19578300 = FE D5 42 44 -> isso dá em decimal -2, -43, 66, 68
+19578300 = 01 2A BD BC -> isso dá em decimal 1, 42, -67, -68

Não testei seu programa, mas isso serve para você testar corretamente.

Mais uma coisa - estou supondo que os bytes estão na ordem "mais significativo primeiro". Se for a ordem contrária ("menos significativo primeiro"), que se vê muito em programas escritos em C/C++/Delphi rodando em máquinas Intel/AMD, então você precisa inverter os bytes.

RicardoCobain

Ahhhh thingol.... pe cara eu já ia postar a solução para lembrar que long tem 8 bytes, como vc disse;
Eu estava fazendo o calculo com 4 porque os dados que eu tou recebendo tem 4 bytes ao total. e no protocolo que me passaram diz q é um long.

cara isso me matou.. perdi 1 dia todo para solucionar isso....

Valeu mesmo pela ajuda....

Tai a Clase se alguem precisar:

/**
 * Classe para conversão de números para Array de Bytes e Vice-versa
 * @author Ricardo Jorge
 */
public class BytesArrayUtil {

    /**
     * Converte a representação dos bytes em Java, para a representação real, que está na faixa de 0 a 255
     * @param bite
     * @return
     */
    public static int convertToRealByteValue(byte bite) {
        int conv = 0;
        if (bite < 0) {
            conv = bite + 256;
        } else {
            conv = bite;
        }
        return conv;
    }

    public static byte[] getBytes(byte[] data, int startIndex, int numBytes) {
        byte[] newByte = new byte[numBytes];
        for (int i = 0; i < newByte.length; i++) {
            newByte[i] = data[startIndex + i];
        }
        return newByte;
    }

    public static byte[] intToBytes(int num) {
        return numberToBytes(num, 4);
    }

    public static int intFromBytes(byte[] data, int offset) {
        return (int) numberFromBytes(data, 4, offset);
    }

    public static byte[] longToBytes(long num) {
        return numberToBytes(num, 8);
    }

    public static long longFromBytes(byte[] data, int offset) {
        return (long) numberFromBytes(data, 8, offset);
    }

    public static byte[] numberToBytes(long number, int numBytes) {
        byte[] data = new byte[numBytes];
        for (int i = numBytes - 1; i >= 0; i--) {
            data[i] = (byte) (number & 0xFF);
            number >>= 8;
        }
        return data;
    }

    public static long numberFromBytes(byte[] data, int numBytes, int offset) {
        long l = 0;
        int i = 0;
        while (i < numBytes) {
            l = l << 8;
            l += data[offset + i] & 0xFF;
            i++;
        }
        return l;
    }
}
T

A sua documentação deve estar pensando no long do C/C++ (que costuma ter 4 bytes e os bytes na ordem inversa do Java, se o C/C++ tiver sido compilado para uma máquina Intel/AMD).

Criado 23 de maio de 2008
Ultima resposta 23 de mai. de 2008
Respostas 5
Participantes 2