![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
TMemoryStream to hex string [D7, WinXP]
Yolly © (2005-06-07 10:51:00)Как можно оптимально перевести каждый байт TMemoryStream в hex.
Сейчас делаю так :
function StreamToHexStr(AStream: TStream): string;
var
AByte: Byte;
begin
try
Result := '';
AStream.Position := 0;
while AStream.Position < AStream.Size do
begin
AStream.ReadBuffer(AByte, SizeOf(AByte));
Result := Result + Format('%.2x ', [AByte]);
end;
except
Result := '';
end
end;
Этот метод меня не устраивает но пока придумать другой
не могу. HELP!
Yolly (2005-06-07 12:25:00) [21]индекс HexArr тут начинается с 1.
переделал так:
function StreamToHexStr(AStream: TStream): string;
const
// HexArr = '0123456789ABCDEF';
HexArr: array[0..15] of char =
('0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E',
'F');
var
AByte: Byte;
i: Integer;
begin
SetLength(Result, AStream.Size * 2);
AStream.Position := 0;
for i := 0 to AStream.Size - 1 do
begin
AStream.ReadBuffer(AByte, SizeOf(AByte));
Result[i * 2 + 1] := HexArr[AByte shr 4];
Result[i * 2 + 2] := HexArr[AByte and $0F];
end;
end;
так вроде работает.
Александр, это получается самый оптимальный метод?
Alexander Panov (2005-06-07 11:42:00) [22]Yolly (07.06.05 10:51)
Метод очень неоптимален.
function StreamToHexStr(AStream: TStream): string;
const HexArr='0123456789ABCDEF';
var
AByte: Byte;
i: Integer;
begin
SetLength(Result,AStream.Size*2);
AStream.Position := 0;
for i := 0 to AStream.Size-1 do
begin
AStream.ReadBuffer(AByte, SizeOf(AByte));
Result[i*2+1] := HexArr[AByte shr 4];
Result[i*2+2] := HexArr[AByte and $0F];
end;
end;
Yolly (2005-06-07 11:37:00) [23]Polevi © (07.06.05 11:00) [2]
это уже быстрее, спасибо !
но я думаю ту много времени теряется на изменение дины Result Result:=Result+ ...
Если бы можно заранее определить размер Result а потом заполнить то получилось бы быстрее ?
Polevi (2005-06-07 11:00:00) [24]function MemoryStreamToHexStr(AStream:TMemoryStream):string;
var
i:integer;
begin
Result:='';
for i:=0 to AStream.Size-1 do
Result:=Result+Format('%.2x ', [PByte(Integer(AStream.Memory)+i)^]);
end;
TUser (2005-06-07 10:52:00) [25]> Этот метод меня не устраивает
Чем?