Page 1 of 2 1 2 LastLast
Results 1 to 15 of 21

Thread: Omzetten externe code naar Delphi

  1. #1

    Omzetten externe code naar Delphi

    Ik zou graag onderstaande code omzetten naar Delphi. Alleen begrijp ik bepaalde delen niet. Bijv. bArr[(decode.length - i3) - 1] = (byte) (((byte) (~decode[i3])) & -1);
    Iemand enig idee hoe ik dit omzet naar Delphi?
    Code:
        public static final String m23372a(String str) {
            int i = 0;
            byte[] decode = Base64.decode(str, 0);
            int length = decode.length;
            byte[] bArr = new byte[length];
            int i2 = 0;
            int i3 = 0;
            while (i2 < length) {
                byte b = bArr[i2];
                bArr[(decode.length - i3) - 1] = (byte) (((byte) (~decode[i3])) & -1);
                i2++;
                i3++;
            }
            byte[] bArr2 = new byte[length];
            int i4 = 0;
            while (i < length) {
                int i5 = i4 + 1;
                int i6 = bArr[i] + 17;
                if (i6 > 255) {
                    bArr2[i4] = (byte) (i6 - 255);
                } else {
                    bArr2[i4] = (byte) i6;
                }
                i++;
                i4 = i5;
            }
            try {
                return new String(bArr2, f6194a);  // f6194a = "Charset.forName(\"UTF-8\")
            } catch (UnsupportedEncodingException unused) {
                return new String(bArr2, f6194a);
            }
        }
    Niets is zo gemakkelijk als het lijkt.

  2. #2
    mov rax,marcov; push rax marcov's Avatar
    Join Date
    Apr 2004
    Location
    Ehv, Nl
    Posts
    10,262
    byte (byte (not decode[i3]) and -1)

    Maar het (and -1) deel lijkt mij overbodig (een and met allemaal enen). De byte typecast zelf zou dat al moeten doen.

  3. #3
    En hoe vertaal ik dat byte (byte (not decode[i3]) and -1) dan naar Delphi?

    Ik heb dit tot zover: (geen idee overigens of dit zo goed is )
    Code:
    var
      i : integer;
      i2 : integer;
      i3 : integer;
      i4 : integer;
      i5 : integer;
      i6 : integer;
      lengthDecode: integer;
      bArr: TBytes;
      decode: TBytes;
      b: TBytes;
      bArr2:  TBytes;
      input: string;
      output: string;
    begin
      input:= 'test';
      lengthDecode := ByteLength(input);
      decode := TEncoding.UTF8.GetBytes(input);
      i  := 0;
      i2 := 0;
      i3 := 0;
      while (i2 < lengthDecode) do
      begin
        //b := bArr[i2];
        //bArr[(decode.length - i3) - 1] = (byte) (((byte) (~decode[i3])) & -1);
        inc(i2);
        inc(i3);
      end;
      i4 := 0;
      while (i < lengthDecode) do
      begin
        i5 := i4 + 1;
        i6 := bArr[i] + 17;
        if (i6 > 255) then
          bArr2[i4] := i6 - 255
        else
          bArr2[i4] := i6;
        inc(i);
        i4 := i5;
      end;
      output:= TEncoding.UTF8.GetString(bArr2);
      showmessage(output);
    end;
    Niets is zo gemakkelijk als het lijkt.

  4. #4
    mov rax,marcov; push rax marcov's Avatar
    Join Date
    Apr 2004
    Location
    Ehv, Nl
    Posts
    10,262
    Dat _IS_ al Pascal/Delphi.

  5. #5
    Oeps, dan doe ik ergens nog iets niet goed. Ik krijg namelijk een Exception class EAccessViolation...
    Niets is zo gemakkelijk als het lijkt.

  6. #6
    mov rax,marcov; push rax marcov's Avatar
    Join Date
    Apr 2004
    Location
    Ehv, Nl
    Posts
    10,262
    Zet length eens naar length(decode). Ik weet niet wat die bytelength() doet, maar je bepaalt die voor je decodeert ?!?!

    En anders... debuggen.

  7. #7
    Het programma loopt oa. vast op bArr2[i4] := i6; Dit mag dus niet. Moet even uitzoeken wat de juiste manier is om dit te doen. Werken met bytes is niet mijn sterkste kant
    Last edited by Greta; 08-Sep-21 at 18:23.
    Niets is zo gemakkelijk als het lijkt.

  8. #8
    Allereerst zie ik het nut van het gebruik van i5 niet. Die wordt op een zinloze manier gebruikt om later i4 op te hogen. Maar goed, het gaat om een 'letterlijke' vertaling.
    Wat je nu doet is een integer i6 toe te wijzen aan een byte barr2[i4]. Dat past niet. Dus je zal de integer eerst moeten omzetten in een byte. Dit wordt in de oorspronkelijke code waarschijnlijk gedaan met '(byte) i6'. Kan dit hier met 'i6 as byte'?

  9. #9
    Byte(i6)

    as is vooral objecten met type check.
    1+1=b

  10. #10
    Byte(i6) werkt bij mij ook niet. Krijg dan even goed de Exception. :-(
    Niets is zo gemakkelijk als het lijkt.

  11. #11
    mov rax,marcov; push rax marcov's Avatar
    Join Date
    Apr 2004
    Location
    Ehv, Nl
    Posts
    10,262
    Denk eerder dat de barr[i4] out of bounds is of zo.

  12. #12
    Met alleen bArr2[1] := Byte(1); gaat het al fout.
    Niets is zo gemakkelijk als het lijkt.

  13. #13
    bArr : TBytes = dynamische array. Zie niet zo snel in de code waar deze met een setlength wordt gezet.

  14. #14
    Bedankt allemaal voor het meedenken. Ik krijg het helaas niet werkend. Heb de afgelopen dagen nog van alles geprobeerd. Ook de dynamische array. Waarschijnlijk doe ik aan de basis al iets niet goed.
    Heb ook nog verschillende java naar delphi conversie tools geprobeerd. Maar die liepen allen direct al vast op de java code.

    Dus zet ik voorlopig het projectje maar even in de koelkast (diepvriezer)
    Niets is zo gemakkelijk als het lijkt.

  15. #15
    Als 1 op 1 vertalen niet lukt, of niet meevalt, is het misschien makkelijker om een nieuw stuk code te schrijven dat hetzelfde doet.
    1+1=b

Page 1 of 2 1 2 LastLast

Thread Information

Users Browsing this Thread

There are currently 1 users browsing this thread. (0 members and 1 guests)

Bookmarks

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •