Hex-Ansicht einer Datei
Ich bin mit Delphi 2009.
Ich möchte den Inhalt einer Datei (in hexadezimal) in einem memo.
Ich bin mit diesem code :
var
Buffer:String;
begin
Buffer := '';
AssignFile(sF,Source); //Assign file
Reset(sF);
repeat
Readln(sF,Buffer); //Load every line to a string.
TempChar:=StrToHex(Buffer); //Convert to Hex using the function
...
until EOF(sF);
end;
function StrToHex(AStr: string): string;
var
I ,Len: Integer;
s: chr (0)..255;
//s:byte;
//s: char;
begin
len:=length(AStr);
Result:='';
for i:=1 to len do
begin
s:=AStr[i];
//The problem is here. Ord(s) is giving false values (251 instead of 255)
//And in general the output differs from a professional hex editor.
Result:=Result +' '+IntToHex(Ord(s),2)+'('+IntToStr(Ord(s))+')';
end;
Delete(Result,1,1);
end;
Wenn ich declare variable "s" als char (ich weiß, dass char geht bis 255) erhalte ich Ergebnisse, die hex-Werte bis zu 65535!
Wenn ich declare variable "s" als byte oder chr (0)..255, es gibt unterschiedliche hex-Werte, im Vergleich zu jeder Hexadezimal-Editor!
Warum ist das so? Wie kann ich die richtigen Werte?
Überprüfen Sie Bilder für die Unterschiede.
1. Bild: Professioneller Hex-Editor.
2. Bild: Funktion Ausgang Memo.
Danke.
- Sicherlich sollten Sie mit Hilfe
AnsiChar
undAnsiString
eher alsWideChar
undUnicodeString
. - Danke. Mit diesem code: function String2Hex(const Buffer: Ansistring): string; begin SetLength(result, 2*Length(Buffer)); BinToHex(@Buffer[1], PWideChar(@result[1]), Length(Buffer)); end; Es funktionierte.
- NEIN. Ihre Eingabedaten in (Schwerpunkt→) - array von bytes (←Schwerpunkt). Annahme, was Sie können Charakter für die led, die Sie direkt in dieses problem.
Du musst angemeldet sein, um einen Kommentar abzugeben.
In Delphi 2009 ein
Char
ist das gleiche wie einWideChar
, das heißt, dass ein Unicode-Zeichen. Ein breites Zeichen belegt zwei bytes. Sie verwenden möchtenAnsiChar
. Vor Delphi 2009 (d.h. vor der Unicode-Delphi)Char
war das gleiche wieAnsiChar
.Auch, sollten Sie nicht verwenden
ReadLn
. Sie behandeln die Datei als text-Datei text-Datei Zeile enden! Dies ist ein Allgemeines Datei! Es kann keine text-Datei, die Zeilenenden an alle!Readln
? Könnten Sie es verwenden, für binäre Dateien Lesen ? Ich Frage deshalb, weil ich war immer mitfile of byte
für, die.ReadLn
es sei denn, es ist eine Textdatei mit der Zeile enden!bytes
stattchars
so, dann brauchen Sie nicht zu konvertieren char in seinen normalen Wert und dann umwandeln in hex-format.I was using
nichtI'm using
, aber danke für den Hinweis trotzdem. OP-begann mit dem Lesen einesFile
geben. In meiner gelöschten Antwort (wo war der Kommentar zu Ineffizienz) ich wollte nur darauf hinweisen, zu LesenByte
stattChar
. Ich werde lieber löschen Sie die Kommentare überFile
geben, um zu verhindern, dass Täuschung.Delphi 2009 unicode aktiviert, so
Char
ist eigentlichWideChar
und das ist ein 2 byte, 16-bit unsigned Wert kann Werte von 0 bis 65535.Könnte man ändern alle Ihre
Char
Erklärungen zuAnsiChar
und alle IhreString
Erklärungen zuAnsiString
, aber das ist nicht der Weg, es zu tun. Sie sollten drop-Pascal-I/O zu Gunsten der modernen stream-basierten I/O, verwenden Sie eineTFileStream
, und nicht behandeln binärer Daten alsChar
.Konsole demo:
fmShareDenyWrite
dort auch.Für einen leichter zu Lesen-Ausgabe, und suchen sich auch besser an, Sie möchten möglicherweise verwenden Sie diese einfachen hex-dump-formatter.
Den HexDump Verfahren Halden eine Fläche von Speicher in ein TStrings in Zeilen von zwei Blöcken von 8 Byte in hex und 16 ascii-chars
Beispiel
Hier ist der code für die dump-format-Funktion
Und hier ist ein komplettes code-Beispiel für dumping den Inhalt einer Datei in einen Memo Feld.
string
istUnicodeString
in Delphi 2009. Wenn Sie möchten, verwenden single-byte-Zeichenfolgen verwendenAnsiString
oderRawByteString
.Sehen String-Typen.