Turan Can 3 Posted January 25, 2020 (edited) Hi, No one left here from the old great masters 🙂 Windows is running smoothly. I think there is a very serious bug on Android. in trouble numbers. I did not see any problems in the alphabet, but I did not look at what the ascii is. Step to step output data 1 xor 0 > #1 2 xor 0 > #2 3 xor 0 > #3 4 xor 0 > #4 5 xor 0 > #5 6 xor 0 > #6 7 xor 0 > #7 //these two lines don't. instead "" gives it. 8 xor 0 > #1 -- 8>#10 why..... 9 xor 0 > #1 -- 9>'t' 1 xor 0 > #1 2 xor 0 > #2 3 xor 0 > #3 4 xor 0 > #4 5 xor 0 > #5 6 xor 0 > #6 7 xor 0 > #7  Sample code procedure TForm1.Button5Click(Sender: TObject); var  I, Len: Integer;  S, T, D, Buff: UTF8String; begin  Len := 16;  SetLength(S, Len);  SetLength(T, Len);  SetLength(D, Len);  S := '1234567891234567';  T := '0000000000000000';  D := T;  XORBuffers(S[1], T[1], Len, D[1]);  // XORBuffers(S[0],T[0],Len,D[0]); end;  procedure TForm1.XORBuffers(const Source1, Source2; Size: Integer; var Dest); var  I: Integer;  S, T,D:PByte;😄Byte;  Buff: Binary; begin  S := PByte(@Source1);  T := PByte(@Source2);  D := PByte(@Dest);  for I := 0 to Size - 1 do  begin   C := Byte(S xor T);  D := Byte(C); end; SetString(Buff, PAnsiChar(@D[0]), Size);end; Edited January 25, 2020 by Turan Can Share this post Link to post
David Heffernan 2345 Posted January 25, 2020 What is this code meant to be doing? As presented here it won't compile:  C := Byte(S xor T);  You can't use xor with pointers.  If you are hoping to perform bytewise xor on a UTF8 buffer and then interpret that as a string, that won't work. You can't guarantee that the output will be valid in any text encoding.  You talk about operations on Char, but you aren't using Char. Char is a UTF-16 character element. You are (I think) attempting to operate on bytes.  It's pointless to call SetLength to allocate a string S and then write S := because the first string you allocated is just thrown away. Each of your calls to SetLength is pointless and can be removed without changing the meaning of the program.  Your for loop doesn't increment the pointers, and doesn't refer to the loop variable. That can't be right.  You have a smiley face emoji in your code. Is that meant to be a variable named D? I guess you need to make sure that the code that you paste is correct.  I recommend that you produce a complete program that you verify compiles, that produces the output you describe, and that you reproduce faithfully here.  Share this post Link to post
Turan Can 3 Posted January 25, 2020 Dear David heffernan;  first of all thank you for your answer. This code has been working on windows for years. I listened to you, I made a different example, but andorid has the same problem. My request from you. Please, I would be very happy if you first tested and respond accordingly. If I have a mistake, can you make a simple example? Please test it. Thank you.  #001#002#003#004#005#006#007#010'\t'#001#002#003#004#005#006#007  function XorUtf(Str1, Str2: UTF8String): UTF8String; var  I: Integer;  Ci:Char; begin  for I := 0 to Length(Str1) - 1 do  begin   Ci := Char(Ord(Str1) xor Ord(Str2));   Result := Result + Ci;  end; end;  procedure TForm1.Button7Click(Sender: TObject); var  I, Len: Integer;  S, T, D, Buff: UTF8String; begin  Len := 16;  SetLength(S, Len);  SetLength(T, Len); //  SetLength(D, Len);  S := '1234567891234567';  T := '0000000000000000'; D:=XorUtf(s,t); end;  Share this post Link to post
Turan Can 3 Posted January 25, 2020 string xor  win32 output #0#1#2#3#4#5#6#7#8#9#1#2#3#4#5#6 android output #001#002#003#004#005#006#007#010'\t'#001#002#003#004#005#006#007  function XorStr(Str1, Str2: String): String; var  I: Integer;  Ci:Char; begin  for I := 0 to Length(Str1) - 1 do  begin   Ci := Char(Ord(Str1) xor Ord(Str2));   Result := Result + Ci;  end; end;  procedure TForm1.Button7Click(Sender: TObject); var  I, Len: Integer;  S, T, D, Buff: string; begin  S := '1234567891234567';  T := '0000000000000000';  D := XorStr(S, T); end; Share this post Link to post
David Heffernan 2345 Posted January 25, 2020 (edited) That code is completely different from the original post, which did not compile. The new code doesn't compile either.  The code can't do anything useful because you will generate strings that are invalid with respect to their encoding.  What are you actually trying to do here? It's hard to get enthused for an algorithm that is so clearly flawed. Edited January 25, 2020 by David Heffernan Share this post Link to post
Attila Kovacs 629 Posted January 25, 2020 (edited) I have no clue what is this for but 0x8 is octal 10 and 0x9 is TAB which is "\t".  We still can't see the most important part of the code, how do you evaluate the "output".  Anyway, no matter what it is, this is for sure not the way this should be done.  Edit: Also, the output is suspicious. "This code has been working on windows for years." How many years? 20? Was it compiled with an AnsiString Delphi compiler?  Edited January 25, 2020 by Attila Kovacs Share this post Link to post
Turan Can 3 Posted January 26, 2020 (edited) Dear friends; First of all, thank you for your answers. There are two results in the picture. Is this true ? Do I need to use something different for the character table? I wrote a very simple code at the bottom. This will explain everything  David and Atilla, this code will work Please run windows first and then android. Look into the list. I made it in the picture below.  procedure TForm1.Button9Click(Sender: TObject); var  Ch: Char;  I: Integer;  T: TStringList; begin  T := TStringList.Create;  for I := 0 to 300 - 1 do  begin   Ch := Char(I);   T.Append(Ch);  end; end;  Edited January 26, 2020 by Turan Can Share this post Link to post
Guest Posted January 26, 2020 @Turan Can Try this var Ch: Char; I: Integer; T: TStringList; TT:array [0..299] of Char; TTIntValues:array[0..299] of Integer ; begin T := TStringList.Create; for I := 0 to 300 - 1 do begin Ch := Char(I); T.Append(Ch); TT[I]:=Char(I); TTIntValues[I]:=Ord(TT[I]); if TTIntValues[I]<>I then raise Exception.Create('Error, char value is wrong'); end; end; The content of TTIntValues is valid and right as it should, with no exception been raised, what you see in #010 or /t are just how the visualizer/debugger interprets and shows those special character, here i can't say for sure if it is right or wrong, but the value in those chars are 100% right. Share this post Link to post
Guest Posted January 26, 2020 The /t is Horizontal tab, it is #9 like Carriage Return (CR) is #13 and Line Feed (LN) is #10, but why the debugger shows only the /t while shows #010 instead #008 while #010 should be /n ? That might be a bug in the parser inside the visualizer only. Share this post Link to post
David Heffernan 2345 Posted January 26, 2020 Everything is fine here. No bug in Delphi.  However, your code that performs xor on character ordinal values and pushes the output back into strings is defective. Share this post Link to post
Attila Kovacs 629 Posted January 26, 2020 It shows the values as octal up to 31 except TAB. Nice. Share this post Link to post
Turan Can 3 Posted January 26, 2020 Hi Kas,  It is no different from the jeans sample I made. your sample test. I added 2 pictures windows and android.  This problem is actually a charset table problem. Possibly differences in windows charset and linux android char sets. For this problem, Delphi had to come up with a solution. Example: At the start of the project, I started to think that there should be a setting like setwindows charset table.  So what is the source of the problem why I need this 🙂 I use AES 256 bit and the same data should be the same in andorid and linux.  https://github.com/Turan-Can/Delphi-Encryption-Compendium  Share this post Link to post
Guest Posted January 26, 2020 @Turan Can i do not use Delphi like you do, so i know nil about your specific problem. But i must give you points for you calmness and courage in you replies, especially considering the language barrier. That is the plus i gave on the OP. Other posters get annoyed, frustrated and angry. Keep it up! Share this post Link to post
Turan Can 3 Posted January 26, 2020 (edited) Probably the person I gave the job will not be able to do it but he insisted he said. 🙂 We will see it all together. Dear friends, I hope you have a good understanding of what I want. Look, this is such a big problem. Think a little, you will understand.  Thanks for your nice words Dany, I try to give as much detail as I can. It seems that I will not be able to solve the problem here. I gave this problem as a "freelancer" as a job. 250$ 🙂 https://www.freelancer.com/projects/delphi/Android-Project-for-Delphi/payments/  Edited January 26, 2020 by Turan Can Share this post Link to post
Kryvich 165 Posted January 26, 2020 (edited) I think, it's a bug in the TStrings visualizer, not in the code itself. Your program should work correctly both in Windows and Android. Nevertheless, I suggest use TBytes for byte manipulation instead of UTF8String. See "Delphi in a Unicode World" by Nick Hodges, Chapter "USING STRINGS AS DATA BUFFERS". Edited January 26, 2020 by Kryvich Share this post Link to post
Turan Can 3 Posted January 26, 2020 No, this is not a tstringlist issue. this is officially chartable difference. You will see the difference when each char 0..to bla bla binds to numeric or character. char (8) > 10 char (9) > t tab linux android This is a serious mistake. It affects thousands of delphi android users. Think a little. Your application on Android sends data to an application on windows.  I'm not asking questions easily. I solve all my work myself. However, this made me drink "alcohol jack daniels oopss I put a reset on my brain." for exactly 1 week 🙂 Delphi needs to urgently a patch. You will either tell the project settings that you want to use the charset table, or it should offer two different char set options for windows and android.  Share this post Link to post
David Heffernan 2345 Posted January 26, 2020 If you are working with AES encryption then the entire topic is moot because you should not be using text at all. Your entire code should operate on bytes. Share this post Link to post
Turan Can 3 Posted January 26, 2020 (edited) Dear David, Pls... What am I telling 🙂 and what am I writing. Please do not write without testing the samples. This is not a help. We extend the subject in vain.  Would you please make an example code?   Edited January 26, 2020 by Turan Can Share this post Link to post
David Heffernan 2345 Posted January 26, 2020 It's not possible to run most of the code you presented as it doesn't compile.  As for my points regarding encryption and text/bytes, those points don't require any code to be run.  Please feel free to ignore my advice if you feel I am wrong. Share this post Link to post
Remy Lebeau 1396 Posted January 27, 2020 12 hours ago, Turan Can said: No, this is not a tstringlist issue. this is officially chartable difference. You will see the difference when each char 0..to bla bla binds to numeric or character. char (8) > 10 char (9) > t tab linux android This is a serious mistake. It affects thousands of delphi android users. I don't quite understand what you are referring to. Are you trying to point out the difference between 0-based string indexing on mobile platforms vs 1-based string indexing on desktop platforms? Because that difference is well documented by Embarcadero. And it is possible to continue using 1-based string indexing on mobile platforms, and to use 0-based string indexing on desktop platforms. 12 hours ago, Turan Can said: Think a little. Your application on Android sends data to an application on windows. And what is the ACTUAL PROBLEM you are having with that? You are not making yourself clear.  Share this post Link to post
Remy Lebeau 1396 Posted January 27, 2020 On 1/25/2020 at 8:54 AM, Turan Can said: function XorUtf(Str1, Str2: UTF8String): UTF8String; var  I: Integer;  Ci:Char; begin  for I := 0 to Length(Str1) - 1 do  begin   Ci := Char(Ord(Str1) xor Ord(Str2));  Result := Result + Ci; end;end;  procedure TForm1.Button7Click(Sender: TObject);var I, Len: Integer; S, T, D, Buff: UTF8String;begin Len := 16;  SetLength(S, Len); SetLength(T, Len);//  SetLength(D, Len);  S := '1234567891234567'; T := '0000000000000000';D:=XorUtf(s,t); end; That code will not work. It needs to be more like this instead: function XorUtf(Str1, Str2: UTF8String): UTF8String; var I: Integer; Ci: UTF8Char; begin for I := Low(Str1) to High(Str1) do begin Ci := Str1[I] xor Str2[I]; Result := Result + Ci; end; end; procedure TForm1.Button7Click(Sender: TObject); var S, T, D: UTF8String; begin S := '1234567891234567'; T := '0000000000000000'; D := XorUtf(s, t); end; Just note that the output of XorUtf() is not guaranteed to be a valid UTF-8 string if non-ASCII characters are present in the source strings, so UTF8String is really not an appropriate return type in this situation. Share this post Link to post
Turan Can 3 Posted January 27, 2020 David, I care about what you write. Is there anything wrong with this simple code? Is it normal to see the output differently in Windows and android? //win32 debug ch #8,#9,#$A //Android debug ch #10,\t,#012  Remy, I know what you're saying. That's not the problem.  procedure TForm1.Button10Click(Sender: TObject); const  CTable: array [0 .. 2] of Byte = ($8, $9, $A); var  Ch: Char;  I: Integer; begin  for I := 0 to High(CTable) do   Ch := Char(CTable); //win32 debug ch #8,#9,#$A //Android debug ch #10,\t,#012 end; Share this post Link to post
David Heffernan 2345 Posted January 27, 2020 It's just an artifact of the debugger visualiser. You are seeing some octal representations. The values are fine. As others have told you already.  Your real problem is the misuse of strings to perform binary operations. Share this post Link to post