Avatar billede ellebaek Nybegynder
13. februar 2003 - 09:27 Der er 5 kommentarer og
1 løsning

Konvertering af 4 bytes til integer - og omvendt.

Jeg er i gang med noget kryptering. Mit problem består i at jeg skal kunne lave et array af 16 bytes om til et array 4 integers og omvendt. Koden jeg har skrevet ser ud som følger:

  private static int[] byteArrayToState(byte[] block) {
    int[] state = new int[4];
    for (int i = 0; i < 4; i++)
        state[i] = (block[4*i  ] << 24)
            | (block[4*i+1] << 16)
            | (block[4*i+2] <<  8)
            | (block[4*i+3] <<  0);

    return state;
    }

    private static byte[] stateToByteArray(int[] state) {
    byte[] block = new byte[16];
    for (int i = 0; i < 4; i++) {
        block[4*i]  = (byte)(state[i] >>> 24);
        block[4*i+1] = (byte)((state[i] <<  8) >>> 24);
        block[4*i+2] = (byte)((state[i] << 16) >>> 24);
        block[4*i+3] = (byte)((state[i] << 24) >>> 24);
    }
      return block;
    }
Ideen er at de to funktioner skal være hinandens inverse (omvendte), men det er de ikke!!! Bitmønstret bliver ikke det samme når man konverterer.
Jeg er overbevist om, at det er i typecastingen i stateToByteArray, det går galt. Spørgsmålet er så hvordan man så kan konverterer de 4 bytes til 1 integer???
Avatar billede arne_v Ekspert
13. februar 2003 - 09:48 #1
package test;

public class BitTest {

    public static void main(String[] args) {
        int[] i1 = { 12345678, 87654321, 11111111, 88888888 };
        byte[] b = stateToByteArray(i1);
        int[] i2 = byteArrayToState(b);
        System.out.println(i2[0] + " " + i2[1]);
    }
    private static int[] byteArrayToState(byte[] block) {
        int[] state = new int[4];
        for (int i = 0; i < 4; i++)
            state[i] =
                (byteToInt(block[4 * i + 3]) << 24)
                    | (byteToInt(block[4 * i + 2]) << 16)
                    | (byteToInt(block[4 * i + 1]) << 8)
                    | byteToInt(block[4 * i]);

        return state;
    }

    private static byte[] stateToByteArray(int[] state) {
        byte[] block = new byte[16];
        for (int i = 0; i < 4; i++) {
            block[4 * i] = (byte) (state[i] & 0xFF);
            block[4 * i + 1] = (byte) ((state[i] >> 8) & 0xFF);
            block[4 * i + 2] = (byte) ((state[i] >> 16) & 0xFF);
            block[4 * i + 3] = (byte) (state[i] >> 24);
        }
        return block;
    }
    private static int byteToInt(byte b) {
        return (int) (0xFF & (short) b);
    }
}
Avatar billede arne_v Ekspert
13. februar 2003 - 09:53 #2
Ovenstående ser ud til at virke.

Dit problem var primært at:
  byte b = (byte)0x01;
  int i = b << 8;
gør hvad du tror den gør, men at:
  byte b = (byte)0x81;
  int i = b << 8;
ikke gør der.

De giver henholdsvis 0x00000100 og 0xFFFF8100 !
Avatar billede ellebaek Nybegynder
13. februar 2003 - 10:14 #3
Hej Arne.

Mange tak for hjælpen. Nu virker det. Jeg er dog ikke helt sikker på, hvad der sker. byteToInt metoden, hvad gør den? hvorfor benytter du en short?
Avatar billede arne_v Ekspert
13. februar 2003 - 10:17 #4
Når java konverterer en byte 0x81 til int så bliver det til 0xFFFFFF81.

Min byteToInt konverterer til 0x00000081.

Det er ligegyldigt om du caster til short eller int inden i
byteToInt.

Man kunne endda argumentere for at det er pænere at caste til
int.

Men det var lige en lille stump kode jeg havde liggende.
Avatar billede arne_v Ekspert
13. februar 2003 - 10:19 #5
Jeg har nemlig brugt meget tid på den her problem-stilling de sidste tre
et halv år.

Jeg formoder at du er opmærksom på at din konvertering følger little
endian konventionen.

+0/+1/+2/+3 skal byttes rundt for at få big endian.
Avatar billede ellebaek Nybegynder
13. februar 2003 - 10:19 #6
cool, mange tak
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester