Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Для новичков > Hex...ASCII


Автор: кмс 31.1.2011, 11:03
Здравствуйте.
Помогите с кодом.
Нужно загрузить бинарный файл и произвести логическую операцию, например xor $CF с 14 байтами,
и потом результат вывести в виде символов ASCII в edit1.
Делаю так:

Код

.................
e: array[1..14] of byte;
.................

procedure TForm1.Button2Click(Sender: TObject);
var
  dmp3: TFileStream;
begin
  if OpenDialog1.Execute then
  begin
    dmp3 := TFileStream.Create(OpenDialog1.FileName, fmOpenReadWrite);
    dmp3.Seek($22, soFromBeginning);
    dmp3.Read(e, sizeof(e));
    e[1] := e[1] xor $CF;
  end;
end;


А вот как вывести в edit1 результат в символах ASCII ни как не пойму.
Спасибо.

Автор: кмс 31.1.2011, 11:49
Разобрался. оказывается все просто smile а я что то в дебри полез.
Код

Edit1.Text:=AnsiChar(e[1]);

Автор: Snowy 1.2.2011, 02:20
Всю строку целиком:
Код
  Edit1.Text := PAnsiChar(@e[1]);

Автор: кмс 2.2.2011, 00:07
Snowy,  спасибо smile

Работает и так:
Код

Edit1.Text := PAnsiChar(@e[1]);

и так:
Код

Edit1.Text := PAnsiChar(@e);

Как правильней?

Автор: northener 2.2.2011, 00:23
Цитата(кмс @  2.2.2011,  00:07 Найти цитируемый пост)
Как правильней?

"Правильнее" вариант с @e[1], потому что будет работать и на статических и на динамических массивах. А второй вариант только на статических.

Автор: кмс 2.2.2011, 00:31
Понятно. Спасибо.

Автор: кмс 2.2.2011, 15:00
Еще один вопрос  smile 
Открываю бинарный файл как писал выше, теперь нужно изменить в нем несколько байт.
Так работает:
Код

..................
g: array[1..4] of Byte;
dmp3: TFileStream;
..................

procedure TForm1.Panel3Click(Sender: TObject);
begin

    dmp3.Seek($19, soFromBeginning);
    dmp3.Write(g, sizeof(g));
    MPHexEditor1.LoadFromStream(dmp3);

end;

но изменения записывает сразу в файл а мне нужно что бы например просто загружался в 
MPHexEditor1 и потом если нужно уже сохранить.

PS: Может где есть описание TMPHexEditor для чайников smile или может какой другой подобный компонент с нормальным описанием?

Автор: кмс 2.2.2011, 20:32
Пока вышел из положения копированием файлов в каталог с программой и уже с копиями работаю, может потом найду лучший вариант.
А вот на счет описания TMPHexEditor вопрос открыт smile

Автор: northener 3.2.2011, 02:42
Цитата(кмс @  2.2.2011,  20:32 Найти цитируемый пост)
А вот на счет описания TMPHexEditor вопрос открыт 

А без TMPHexEditor жизни нет и быть не может?

Автор: кмс 3.2.2011, 08:39
Цитата(northener @  3.2.2011,  02:42 Найти цитируемый пост)
А без TMPHexEditor жизни нет и быть не может?

Может, но с ним жить веселей smile
К тому же вопрос изначально стоял так:
Цитата
.....или может какой другой подобный компонент с нормальным описанием?

Автор: кмс 6.2.2011, 17:03
Еще раз здравствуйте smile
Помогите разобраться в коде.
Код

..........................
str: string;
a: array[1..8] of Byte;
b: array[1..256] of Byte = ($00, $01, ...$FF);
......

a[1]:=a[1] xor b[1]; //
str:=ByteToStr(a[1]);//  Нужно организовать это в цикл
a[1]:=a[1] xor b[2];//
str:=ByteToStr(a[1]);//
......
a[1]:=a[1] xor b[256];//
str:=ByteToStr(a[1]);//
..........................

Не могу разобраться как организовать цикл с массивами.
Спасибо.


Автор: кмс 7.2.2011, 01:15
Вообщем разобрался, видать надо просто спросить что бы стимул появился разобраться smile


Код

  if rb4.Checked then
  begin
    for algcount := 0 to High(alg) do
    begin
      mmo1.Lines.Add(str1 + ' not ' + ByteToStr(alg[algcount]) + ' = ');
      for datcount := 0 to strlenght do
      begin
        f[datcount] := dat[datcount] and alg[algcount]; // Здесь выдает ошибку
        mmo1.Text := mmo1.Text + ByteToStr(f[datcount]);
        if (f[datcount] = StrToByte(str3)) and (str3 <> '') then
          mmo2.Lines.Add(str1 + ' not ' + ByteToStr(alg[algcount]) + ' = ' + ByteToStr(f[datcount]));
      end;

    end;
  end;


Автор: northener 7.2.2011, 02:00
Цитата(кмс @  7.2.2011,  01:15 Найти цитируемый пост)
Вообщем разобрался, видать надо просто спросить что бы

Давно известная истина. Если смог сформулировать вопрос "по существу", сможешь сам найти ответ! Достаточно только ещё немного подумать.

Автор: кмс 24.2.2011, 14:23
Снова возвращаюсь к теме, только теперь надо наоборот, Ansi символы перевести в байты.
То есть, например в Edit1 - 123AH567, надо каждый символ перевести в его HEX представление, что бы получилось так - 3132334148353637
Подскажите плз, а то уже замучился smile

Автор: CODeRUS 1.3.2011, 19:20
Код

var
ch: char;
str, hexstr: string;
...

str:= Edit1.Text;
for ch in str do
    hexstr := hexstr + inttohex(ord(ch), 2);


как-то так

Автор: MetalFan 1.3.2011, 19:30
BinToHex/HexToBin ?

Автор: CODeRUS 1.3.2011, 22:41
а каким его туда местом?

Автор: MetalFan 2.3.2011, 00:15
А что, разве никаким? Задачу по преобразованию Hex<->Bin как раз решает на ура без извращения с IntToHex и т.п.

Автор: CODeRUS 2.3.2011, 01:59
Вроде как в теме никто кроме вас о bin и не заикался. Или я что-то упустил? Или вы задачу неверно прочитали?

Автор: MetalFan 2.3.2011, 09:04
Цитата(CODeRUS @  1.3.2011,  19:20 Найти цитируемый пост)
for ch in str do
    hexstr := hexstr + inttohex(ord(ch), 2);

легко заменяется одним вызовом BinToHex.  smile не? 

Автор: CODeRUS 2.3.2011, 11:34
как бы то да не то, и легкость по-моему сомнительная. мучать указатели, выделять память, совсем не один вызов получается). да и от версии делфи результат должен отличаться, ибо в 2010 скажем в результате будет 2 байта на символ, в 2007 - 1 байт.

Автор: MetalFan 2.3.2011, 13:28
CODeRUS, не вижу никаких сложностей.
Код для D2010
Код

var
  lSrc: AnsiString;
  lRes: string;
begin
  lSrc := edt1.Text;
  SetLength( lRes, Length(lSrc) * 2);
  BinToHex( PAnsiChar(lSrc), PWideChar(lRes), Length(lSrc));
  ShowMessage(lRes);

Гораздо проще и без всяких явных циклов и IntToHex'ов)
Единственный момент - не накосячить с размерами буферов.

Автор: CODeRUS 2.3.2011, 14:45
хмм и правда, совсем забыл про такие преобразования, спасибо))

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)