tags:

views:

241

answers:

2

How do I convert a byte array to a string (base 256) in Delphi?

+3  A: 

I'm not sure what do you mean by Base256. If you want to get hex representation of data, use this:

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;

If you want to just render the data as a string (this doesn't change the content!), where for each byte of data you'd get a single ASCII symbol with that code, do

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;
himself
Base 256 string is an ASCII string, as you got it correctly it is Ansistring/String in Delphi. The function bintoAscii works perfectly. Just that need to declare var i. Thank u!
seveleven
If you just want to render the data you can just copy it to an AnsiString using Copy(Memory)
Remko
There are only 127 characters in the ASCII character set. Maybe you are referring to Windows-1252.
Andreas Rejbrand
+2  A: 

Use the built-in SetString command. It sets the string to the required length and copies the bytes. There's no need for the array to be null-terminated. In fact, if the array has zero--valued bytes in it, they'll correctly appear within the string; they won't terminate the string.

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

If you have a UnicodeString, then you'll need to halve the length parameter since it measures characters, not bytes:

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

See also, Converting TMemoryStream to String in Delphi 2009.

Rob Kennedy
Tried it, it works perfectly as well!
seveleven
I got the length of byte array using Length(ByteArray).
seveleven