Avatar billede nielsbrinch Nybegynder
27. oktober 2003 - 15:20 Der er 15 kommentarer og
2 løsninger

Oversæt 10 linjer fra C til Java

Nogen der gider oversætte det her fra C til Java? Jeg kunne måske oversætte det selv, men det ville involvere en hel del gætteri og det er jeg ikke meget for, da jeg så ikke ville være sikker på det fungerer som det skal.

void code(long* v, long* k)  {             
  unsigned long y=v[0],z=v[1], sum=0, delta=0x9e3779b9, n=32 ;            /* a key schedule constant */
  while (n-->0) {                      /* basic cycle start */
      sum += delta ;
      y += (z<<4)+k[0] ^ z+sum ^ (z>>5)+k[1] ;
      z += (y<<4)+k[2] ^ y+sum ^ (y>>5)+k[3] ;  /* end cycle */
  }
  v[0]=y ; v[1]=z ;
}

void decode(long* v,long* k)  {
  unsigned long n=32, sum, y=v[0], z=v[1], delta=0x9e3779b9 ;
  sum=delta<<5 ;
                      /* start cycle */
  while (n-->0) {
      z-= (y<<4)+k[2] ^ y+sum ^ (y>>5)+k[3] ;
      y-= (z<<4)+k[0] ^ z+sum ^ (z>>5)+k[1] ;
      sum-=delta ;
  }
                      /* end cycle */
  v[0]=y ; v[1]=z ;
}

Tak
Avatar billede Slettet bruger
27. oktober 2003 - 15:31 #1
void code(long[] v, long[] k)  {
  long y=v[0],z=v[1], sum=0, delta=0x9e3779b9, n=32 ;            /* a key schedule constant */
  while (n-->0) {                      /* basic cycle start */
      sum += delta ;
      y += (z<<4)+k[0] ^ z+sum ^ (z>>5)+k[1] ;
      z += (y<<4)+k[2] ^ y+sum ^ (y>>5)+k[3] ;  /* end cycle */
  }
  v[0]=y ; v[1]=z ;
}

void decode(long[] v,long[] k)  {
  long n=32, sum, y=v[0], z=v[1], delta=0x9e3779b9 ;
  sum=delta<<5 ;
                      /* start cycle */
  while (n-->0) {
      z-= (y<<4)+k[2] ^ y+sum ^ (y>>5)+k[3] ;
      y-= (z<<4)+k[0] ^ z+sum ^ (z>>5)+k[1] ;
      sum-=delta ;
  }
                      /* end cycle */
  v[0]=y ; v[1]=z ;
}
Avatar billede nielsbrinch Nybegynder
27. oktober 2003 - 15:33 #2
Hov, måske underdrev jeg lidt med de 10 linjer :-)
Avatar billede arne_v Ekspert
27. oktober 2003 - 15:38 #3
Erstat long med int (C long og Java int er det samme).

Erstat * med [].

Fjern unsigned og håb på at det ikke laver kage i det (Java har ikke
unsigned data typer).

Ellers burde koden virke ens.
Avatar billede Slettet bruger
27. oktober 2003 - 15:43 #4
bare et lille spørgsmål: er der i dette tilfælde meget forskel på at bruge long og int i java?
Avatar billede arne_v Ekspert
27. oktober 2003 - 15:48 #5
Normalt ikke.

Men i forbindelse med >> og << kan der meget vel være det.

Eksempel:

public class IntLong {
    public static void main(String[] args) {
        int i;
        long l;
        i = 0x12345678;
        l = 0x12345678;
        System.out.println(Integer.toHexString((i << 5) >> 5));
        System.out.println(Long.toHexString((l << 5) >> 5));
        i = 0x87654321;
        l = 0x87654321;
        System.out.println(Integer.toHexString((i << 5) >> 5));
        System.out.println(Long.toHexString((l << 5) >> 5));
    }
}
Avatar billede nielsbrinch Nybegynder
27. oktober 2003 - 15:49 #6
Det kan jeg ikke se der er. Måske er long endda bedre lige netop her, idet den unsigned long fra C måske er unsigned fordi den så kan indeholde et ekstra ciffer - hvilket vil forårsage fejl hvis man vælger signed java-int som er samme størrelse som en signed C-long ... giver jeg mening?
Avatar billede nielsbrinch Nybegynder
27. oktober 2003 - 15:49 #7
ok ok :-) jeg trækker mine ynkelige teorier tilbage
Avatar billede arne_v Ekspert
27. oktober 2003 - 15:51 #8
Brugen af long giver ganske vist så rigeligt den ekstra bit i
unsigned.

Så i rent arithemtiske beregninger er det en fin løsning. Jeg er
betydeligt mere skeptisk overfor shift operationer.
Avatar billede Slettet bruger
27. oktober 2003 - 15:53 #9
jeg bøjer mig i støvet for den udførlige forklaring og er nu klogere
Avatar billede arne_v Ekspert
27. oktober 2003 - 16:01 #10
[rent teknisk kan en C long sagtens være 64 bit, men på de flester gængse
systemer er den dog 32 bit]
Avatar billede arne_v Ekspert
27. oktober 2003 - 16:04 #11
Niels>

Du var meget hurtigt til at acceptere.

Der kan sagtens være flere giftigheder i det her problem.

Men du kan jo skrive igen, hvis det driller.

En interessant lile øvelse var jo at starte med at teste
C og Java versionen på lidt test data og sammenligne
resultater.

Hvis unsigned driller kan det normalt løses med lidt
omskrivning.
Avatar billede nielsbrinch Nybegynder
27. oktober 2003 - 16:53 #12
Du har helt ret, det er ham her vist også kommet frem til :-(

http://www.theorem.com/java/Free.htm#TEA
Avatar billede nielsbrinch Nybegynder
27. oktober 2003 - 17:06 #13
Forresten burde der i oversættelsen vistnok være en returnering af v, ikke?
Avatar billede arne_v Ekspert
27. oktober 2003 - 18:57 #14
Hvorfor  ? I C koden returnes v ikke (og man kan godt modificere et
array et Java).
Avatar billede arne_v Ekspert
27. oktober 2003 - 19:02 #15
Ja.

Og løsningen er typisk man AND'er lidt hist og pist for at holde
sign korrekt.
Avatar billede nielsbrinch Nybegynder
27. oktober 2003 - 19:16 #16
Nåh, ja du har ret hvis metoderne kaldes i samme klasse. Men ellers giver det ikke mening. Du kan vel ikke lige røbe hvordan man lave int[] om til byte[] og tilbage igen på en stensikker måde?
Avatar billede arne_v Ekspert
27. oktober 2003 - 20:17 #17
int[] -> byte[] er simpelt cast af elementerne
byte[] -> int[] kræver den afskyelige and med 0xFF (hvis man vil have de unsigned værdier)

Eksempel:

public class IntByteInt {
    public static void main(String[] args) {
        int a[] = new int[256];
        for(int i = 0; i < a.length; i++) {
            a[i] = i;
        }
        byte[] b = new byte[256];
        for(int i = 0; i < b.length; i++) {
            b[i] = (byte)a[i];
        }
        int[] c = new int[256];
        for(int i = 0; i < b.length; i++) {
            c[i] = 0xFF & b[i];
        }
        for(int i = 0; i < a.length; i++) {
            if(a[i] != c[i]) {
                System.out.println(i + " : " + a[i] + " -> " + c[i]);
            }
        }
    }
}
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