Odczytać hex z pliku

0

Cześć, jak odczytać hexa z pliku?

Tzn. mam jakiś plik no i jak chcę odczytać znak, czy coś, to normalnie posługuję się zmienną string i czytam(przeważnie używam ReadBuffer).
Gdy odczytuję jakąś liczbę też nie ma problemu. Zmienna byte lub integer.

Natomiast problem pojawia się, gdy chcę odczytać hex. Gdy odczytuję to jako string i przeprowadzam konwersję na integer oczywiście nie ma spodziewanego efektu. Więc jak odczytać hex ze znanego bajtu?

0

Nie bardzo widzę problem...
Plik otwierasz jako niezdefiniowany, lub file of byte, czytasz przy pomocy BlockRead (najszybsze) i potem przy wyświetlaniu stosujesz konwersje IntToHex.

0

Nie bardzo widzę problem...
Plik otwierasz jako niezdefiniowany, lub file of byte, czytasz przy pomocy BlockRead (najszybsze) i potem przy wyświetlaniu stosujesz konwersje IntToHex.

Nie chcę odczytać liczby dziesiętnej, tylko szesnastkową

0

Nie chcę odczytać liczby dziesiętnej, tylko szesnastkową

ehhhhh...

  1. Jeżeli masz w pliku liczby w systemie szesnastkowym, oddzielone spacją (np. AA 12F FF... itp.) to czytasz do stringa całą linie, potem oddzielasz poszczególne liczby i takie kawałki zamieniasz na Hex (nie wiem czy jest HexToInt, jeśli nie ma to można bardzo prosto napisać)

  2. Jeżeli chcesz dowolny plik traktować jak file of byte (tylko że file of hex), to możesz mieć poważny problem, gdyż musiałbyś zrobić własną klasę hex (wraz ze zdefiniowanymi operatorami + - * / i inne, co chyba w Delphi nie jest możliwe*) oraz nauczyć funkcję write zapisywać do takiej zmiennej, co też nie będzie proste, gdyż funkcja write jest chyba wbudowana w kompilator i dostanie się do niej może nie być łatwe.

  3. To że czytasz z pliku liczby bezpośrednio do zmiennej Integer lub Float świadczy tylko o tym, że są zdefiniowane konwersje dla danych typów...

Jeżeli Tobie dalej o coś zupełnie innego chodzi, to ja już chyba kapituluję... :-P

  • Właśnie - pytanie - czy w Delphi można przedefiniować operatory ??
0
  • Właśnie - pytanie - czy w Delphi można przedefiniować operatory ??

Nie.
Co do odczytywania: StrToInt zadziała, ale tak:

Liczba := StrToInt('$' + OdczytanyText);

Oczywiście OdczytanyText jest bez spacji i innych tego typu udziwień :)

0
  1. Jeżeli chcesz dowolny plik traktować jak file of byte (tylko że file of hex), to możesz mieć poważny problem, gdyż musiałbyś zrobić własną klasę hex (wraz ze zdefiniowanymi operatorami + - * / i inne, co chyba w Delphi nie jest możliwe*) oraz nauczyć funkcję write zapisywać do takiej zmiennej, co też nie będzie proste, gdyż funkcja write jest chyba wbudowana w kompilator i dostanie się do niej może nie być łatwe.

Chyba o to chodzi :/ Tzn. jak np. otwieram plik w jakimś HexEdytorze(np. pod NC) to jako zawartość w danym bajcie pojawia się jakiś znak. Np. kreska Sheffera. A jako hex jest np. 0A.

0

Tzn., że jak otworzysz jakiś plik w hex edytorze, z reguły zobaczysz coś takiego:

4D 5A 50 00 02 00 00 00 04 00 0F 00 FF FF 00 00  MZP.........˙˙..
B8 00 00 00 00 00 00 00 40 00 1A 00 00 00 00 00  ¸.......@.......
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
00 00 00 00 00 00 00 00 00 00 00 00 00 01 00 00  ................
BA 10 00 0E 1F B4 09 CD 21 B8 01 4C CD 21 90 90  ş...´.Í!¸.LÍ!
54 68 69 73 20 70 72 6F 67 72 61 6D 20 6D 75 73  This program mus
74 20 62 65 20 72 75 6E 20 75 6E 64 65 72 20 57  t be run under W
69 6E 33 32 0D 0A 24 37 00 00 00 00 00 00 00 00  in32..$7........

To powyżej, to fragment "zrzutu szesnastkowego" utworzonego przez mojego starego HexDump-a.

A działa to tak:
Odczytuję 16 bajtów (buffer: array[0..15] of Byte).
Potem jest coś takiego:

s := '';
for i := 0 to 15 do
  s := s + IntToHex(buffer[i], 2) + ' ';
s := s + ' ';

A potem:

for i := 0 to 15 do
begin
  if (buffer[i] < 31) then
    s := s + '.'
  else
    s := s + Chr(buffer[i]);
end;
SynEdit1.Lines.Add(s);

I tak do końca pliku...
Tylko pamiętaj, że dla większości plików FileSize mod 16 <> 0 !

1 użytkowników online, w tym zalogowanych: 0, gości: 1