Как преобразовать массив байтов в строку (основание 256) в Delphi?
Delphi - преобразовать массив байтов в строку
Ответ 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().