Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Probleme mit PChar (https://www.delphipraxis.net/180187-probleme-mit-pchar.html)

Walter Landwehr 29. Apr 2014 09:47

Delphi-Version: XE2

Probleme mit PChar
 
Hallo,

ich habe vor Jahren in D6 oder D2007 folgende Function erstellt.

Delphi-Quellcode:
function Base16ToStr(Value: PChar; Len: Integer): String;
var
   D: PByte;
   V: Byte;
   S: PChar;
begin
   Result := '';
   if Value = nil then Exit;
   if Len < 0 then Len := StrLen(Value);
   SetLength(Result, (Len +1) div 2);
   D := PByte(Result);
   S := PChar(Value);
   while Len > 0 do
   begin
      V := Byte(UpCase(S^));
      Inc(S);
      if V > Byte('9') then D^ := V - Byte('A') + 10
         else D^ := V - Byte('0');
      V := Byte(UpCase(S^));
      Inc(S);
      D^ := D^ shl 4;
      if V > Byte('9') then D^ := D^ or (V - Byte('A') + 10)
         else D^ := D^ or (V - Byte('0'));
      Dec(Len, 2);
      Inc(D);
   end;
   SetLength(Result, PChar(D) - PChar(Result));
end;
Nun habe ich versucht Pchar durch PWideChar oder PAnsiChar zu ersetzen. Leider bringt mir die Function eine völlig anderes Ergebnis als unter D2007.

Was muß ich verändern um wieder das Ergebnis wie unter D2007 zu erreichen?

Hat jemand einen Tipp.

Vielen Dank im voraus.

Sherlock 29. Apr 2014 09:52

AW: Probleme mit PChar
 
Was soll die Methode eigentlich grundsätzlich tun?

Sherlock

Blup 29. Apr 2014 10:00

AW: Probleme mit PChar
 
Alle "PChar" durch "PAnsiChar" und alle "String" durch AnsiString" ersetzen:
Delphi-Quellcode:
function Base16ToStr(Value: PAnsiChar; Len: Integer): AnsiString;
var
   D: PByte;
   V: Byte;
   S: PAnsiChar;
begin
{...usw.}
Edit: Das geht natürlich auch übersichtlicher.
Delphi-Quellcode:
function HexValue(AValue: AnsiChar): Byte;
begin
  case AValue of
    '0'..'9': Result := Ord(AValue) - Ord('0');
    'A'..'F': Result := Ord(AValue) - Ord('A') + 10;
    'a'..'f': Result := Ord(AValue) - Ord('a') + 10;
  else
    raise Exception.Create('ungültiges Zeichen');
  end;
end;

function Base16ToStr(Value: PAnsiChar; Len: Integer): AnsiString;
var
  v: Byte;
  i: Integer;
begin
  Result := '';
  if Value = nil then
    Exit;

  if Len < 0 then Len := StrLen(Value);

  if Odd(Len) then
    raise Exception.Create('ungerade Anzahl für halbe Byte');

  SetLength(Result, Len div 2);
  for i := 1 to Length(Result) do
  begin
    v := HexValue(Value^) shl 4;
    Inc(Value);
    v := v or HexValue(Value^);
    Inc(Value);
    Result[i] := AnsiChar(v);
  end;
end;

baumina 29. Apr 2014 10:24

AW: Probleme mit PChar
 
Falsch gelesen ... [entfernt]

Walter Landwehr 29. Apr 2014 11:40

AW: Probleme mit PChar
 
Danke Blup, der Tipp war gut. Musste nur noch String durch AnsiString ersetzen und schon funktionierte es. PChar hatte ich vorher schon in PAnsiChar ersetzt.


Alle Zeitangaben in WEZ +1. Es ist jetzt 21:29 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz