Подтвердить что ты не робот

Delphi - преобразовать массив байтов в строку

Как преобразовать массив байтов в строку (основание 256) в Delphi?

4b9b3361

Ответ 1

Используйте встроенную команду SetString. Он устанавливает строку на требуемую длину и копирует байты. Нет необходимости, чтобы массив был завершен с нулевой отметкой. На самом деле, если массив содержит в нем нулевые байты, они будут правильно отображаться внутри строки; они не будут прервать строку.

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

Если у вас есть UnicodeString, тогда вам нужно уменьшить наполовину параметр длины, поскольку он измеряет символы, а не байты:

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

См. также Преобразование TMemoryStream в String в Delphi 2009.

Ответ 2

Я не уверен, что вы подразумеваете под Base256. Если вы хотите получить шестнадцатеричное представление данных, используйте это:

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;

Если вы хотите просто визуализировать данные как строку (это не меняет содержимое!), где для каждого байта данных вы получите один символ ASCII с этим кодом, сделайте

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;

Ответ 3

Я думаю, что есть еще один хороший способ конвертировать байтовые массивы в строки - функцию Indy, называемую BytesToString, содержащуюся в IdGlobal. Он также позволяет вам указать StartIndex, Length и TEncoding для вашей строки. Я использовал его несколько раз, и я нахожу его очень полезным.

Ответ 4

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

Быть GetString() обратная операция GetBytes().