web-dev-qa-db-fra.com

Delphi - Convertir un tableau d'octets en chaîne

Comment convertir un tableau d'octets en une chaîne (base 256) dans Delphi?

25
seveleven

Utilisez la commande intégrée SetString . Il définit la chaîne à la longueur requise et copie les octets. Il n'est pas nécessaire que le tableau se termine par null. En fait, si le tableau contient des octets de valeur nulle, ils apparaîtront correctement dans la chaîne; ils ne termineront pas la chaîne.

SetString(AnsiStr, PAnsiChar(@ByteArray[0]), LengthOfByteArray);

Si vous avez un UnicodeString, vous devrez alors diviser par deux le paramètre de longueur car il mesure les caractères, pas les octets:

SetString(UnicodeStr, PWideChar(@ByteArray[0]), LengthOfByteArray div 2);

Voir aussi Conversion de TMemoryStream en chaîne dans Delphi 2009 .

40
Rob Kennedy

Je ne sais pas ce que tu veux dire par Base256. Si vous souhaitez obtenir une représentation hexadécimale des données, utilisez ceci:

function bintostr(const bin: array of byte): string;
const HexSymbols = '0123456789ABCDEF';
var i: integer;
begin
  SetLength(Result, 2*Length(bin));
  for i :=  0 to Length(bin)-1 do begin
    Result[1 + 2*i + 0] := HexSymbols[1 + bin[i] shr 4];
    Result[1 + 2*i + 1] := HexSymbols[1 + bin[i] and $0F];
  end;
end;

Si vous voulez simplement rendre les données sous forme de chaîne (cela ne change pas le contenu!), Où pour chaque octet de données vous obtiendrez un seul symbole ASCII avec ce code, faites

function bintoAscii(const bin: array of byte): AnsiString;
var i: integer;
begin
  SetLength(Result, Length(bin));
  for i := 0 to Length(bin)-1 do
    Result[1+i] := AnsiChar(bin[i]);
end;
10
himself

Je pense qu'il y a une autre belle façon de convertir des tableaux d'octets en chaînes - une fonction Indy appelée BytesToString contenue dans IdGlobal. Il vous permet également de spécifier StartIndex, Length et TEncoding pour votre chaîne. Je l'ai utilisé plusieurs fois et je le trouve très utile.

2
Boris D. Teoharov
var
   LString : string;
   LBytes : TArray<byte>;
begin    
   LBytes := TArray<byte>.Create($01, $02, $03);
   LString := TEncoding.ANSI.GetString(ABytes);
end;

Être GetString () l'opération inverse de GetBytes ().

2
Eduardo