Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

TMemoryStream to hex string [D7, WinXP]


Страницы:   1 2

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]

> Этот метод меня не устраивает

Чем?


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо