![]() |
Datei als HEX laden (Suche schon mehrfach benutzt)
Hey :)
Ich versuche jetzt schon seit einiger Zeit eine Datei als HEX String zu laden und so ganz möchte mir das nicht gelingen. Das Problem hier ist, dass Delphi anscheinend bei einem leeren Byte (00) aufhört die Datei zu lesen. Das heißt ich suche mir mit dem OpenFileDialouge eine Datei aus und klicke auf öffnen und Delphi lädt mir sowohl als normalen String als auch als Hex string nur die ersten paar bytes, weil es dann auf ein 00 trifft. Ich habe mich dann mal im Internet umgeschaut aber nicht wirklich eine Lösung dazu gefunden. Also habe ich schon fertige Funktionen ausprobiert, die eine Datei sofort als HEX laden. Diese geben mir aber nur errors. Jetzt bin ich echt ratlos was ich tun soll :( Ich hoffe mir kann jemand helfen. |
AW: Datei als HEX laden (Suche schon mehrfach benutzt)
Achtung, jetzt etwas für den Langzeitspeicher:
Jede Datei besteht aus einer Folge an Bytes! Also liest man die Datei in etwas, dass eine Bytefolge halten kann (z.B. ![]()
Delphi-Quellcode:
ist) und hängt das an etwas, dass wiederum diese Ansicht speichern kann (wäre hier z.B. ein
string
Delphi-Quellcode:
)
string
|
AW: Datei als HEX laden (Suche schon mehrfach benutzt)
Danke für die schnelle Antwort :)
Ich habe folgende Funktion:
Delphi-Quellcode:
Wenn ich die nun folgendermaßen benutze:
function LoadFileAsHex(const FileName: String) : String;
var Stream : TFileStream; BinStr : String; TmpStr : String; HexStr : String; i : Integer; begin Stream:= TFileStream.Create(FileName, fmOpenRead); try SetLength(BinStr, Stream.Size); Stream.ReadBuffer(BinStr, Length(BinStr)); finally Stream.Free; end; SetLength(HexStr, 2*Length(BinStr)); for i:= 1 to Length(BinStr) do begin TmpStr:= Format('%.2x', [BinStr[i]]); HexStr[2*i-1]:= TmpStr[1]; HexStr[2*i]:= TmpStr[2]; end; Result:= HexStr; end;
Delphi-Quellcode:
wird mir ausgegeben, dass es einen "Stream read error" gibt und ich weiß nicht, was dazu führt :/
Edit1.Text := uHexTools.LoadFileAsHex(OpenFile.FileName); //OpenFile = OpenFileDialogue
|
AW: Datei als HEX laden (Suche schon mehrfach benutzt)
Nochmal: Byte!
Ich kann das auch größer schreiben :roll: |
AW: Datei als HEX laden (Suche schon mehrfach benutzt)
Versuchs doch mal so, wie Sir Rufo schon geschrieben hat.
Delphi-Quellcode:
function LoadFileAsHex(const FileName: String) : String;
var Stream : TFileStream; BinStr : TBytes; begin Stream:= TFileStream.Create(FileName, fmOpenRead); try SetLength(BinStr, Stream.Size); Stream.ReadBuffer(BinStr, Length(BinStr)); finally Stream.Free; end; end; |
AW: Datei als HEX laden (Suche schon mehrfach benutzt)
Wenn ich die von dir vorgeschlagene Variante benutze, kommt der Fehler, dass BinStr und Stream.Size nicht kompatibel sind :(
|
AW: Datei als HEX laden (Suche schon mehrfach benutzt)
Logisch, das ist ja auch nicht das, was ich vorgeschlagen habe.
Und die Daten aus dem Stream einfach so in einen string zu blasen ist einfach falsch. Suche doch mal danach, wie man aus einem Stream ein Byte lesen kann. Dieses süße kleine Byte ist doch genau was du brauchst! (Byte -> Hex) |
AW: Datei als HEX laden (Suche schon mehrfach benutzt)
Falls dir die passenden Suchbegriffe fehlen, hier ein zielführendes Beispiel
![]() |
AW: Datei als HEX laden (Suche schon mehrfach benutzt)
Liste der Anhänge anzeigen (Anzahl: 1)
Hier ist ein brauchbarer Code:
![]() Wenn man im Memo den Font LUCIDA CONSOLE verwendet und den Code etwas ändert, kommt was Schönes heraus.
Delphi-Quellcode:
unit Unit1;
interface uses Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls; type TForm1 = class(TForm) Memo1: TMemo; Button1: TButton; Edit1: TEdit; procedure Button1Click(Sender: TObject); procedure FormCreate(Sender: TObject); private { Private-Deklarationen } public { Public-Deklarationen } end; var Form1: TForm1; implementation {$R *.dfm} function HexB (b: Byte): String; const HexChar: Array[0..15] of Char = '0123456789ABCDEF'; begin result:= HexChar[b shr 4]+HexChar[b and $0f]; end; procedure HexDump(var data; size: Integer; s: TStrings); const sepHex=' '; sepAsc=' '; nonAsc='.'; var i : Integer; hexDat, ascDat : String; buff : Array[0..1] of Byte Absolute data; begin hexDat:=''; ascDat:=''; for i:=0 to size-1 do begin hexDat:=hexDat+' '+HexB(buff[i]); if ((buff[i]>31) and (buff[i]<>255)) then ascDat:=ascDat+ ANSIChar(buff[i]) else ascDat:=ascDat+nonAsc; if (((i+1) mod 16)<>0) and (((i+1) mod 8)=0) then hexDat:=hexDat+' '+sepHex; if ((i+1) mod 16)=0 then begin s.Add(hexdat+sepAsc+' '+ascdat); hexdat:=''; ascdat:=''; end; end; if (size mod 16)<>0 then begin if (size mod 16)<8 then hexDat:=hexDat+StringOfChar(' ',(8-(size mod 8))*2) +sepHex+StringOfChar(' ',16) else hexDat:=hexDat+StringOfChar(' ',(16-(size mod 16))*2); s.Add(hexDat + sepAsc + ascDat); end; end; (* procedure TForm1.Button1Click(Sender: TObject); var FStream: TFileStream; buff: array[0..$fff] of Byte; nRead: Integer; begin FStream := TFileStream.Create(edit1.text, fmOpenRead or fmShareDenyWrite); try repeat nRead := FStream.Read(Buff, SizeOf(Buff)); if nRead<>0 then hexdump(buff, nRead, memo1.lines); until nRead=0; finally FStream.Free; end; end; *) //Mit ListBox ist es viel schneller !! <--------------------------------- procedure TForm1.Button1Click(Sender: TObject); var FStream: TFileStream; buff: array[0..$fff] of Byte; nRead: Integer; begin LB1.Items.Clear; LB1.Items.BeginUpdate; FStream := TFileStream.Create(edit1.text, fmOpenRead or fmShareDenyWrite); try repeat nRead := FStream.Read(Buff, SizeOf(Buff)); // if nRead<>0 then hexdump(buff, nRead, memo1.lines); if nRead<>0 then hexdump(buff, nRead, LB1.Items); until nRead=0; finally FStream.Free; end; LB1.Items.Endupdate; end; procedure TForm1.FormCreate(Sender: TObject); begin Button1Click(Self); end; end. |
AW: Datei als HEX laden (Suche schon mehrfach benutzt)
Mit einem MemoryStream gehts auch:
Delphi-Quellcode:
function GetBinToHex(Value: TStream): string; // Analog TCustomIniFile.WriteBinaryStream;
var Stream: TMemoryStream; begin SetLength(Result, (Value.Size - Value.Position) * 2); if Length(Result) > 0 then begin Stream := TMemoryStream.Create; try Stream.CopyFrom(Value, Value.Size - Value.Position); Stream.Position := 0; BinToHex(PChar(Integer(Stream.Memory) + Stream.Position), PChar(Result), Stream.Size - Stream.Position); finally Stream.Free; end; end; end; function BinToHexFromFile(const FileName: string): string; var FileStream: TFileStream; begin Result := ''; if FileExists(FileName) then begin FileStream := TFileStream.Create(FileName, fmOpenRead or fmShareDenyWrite); try FileStream.Position := 0; Result := GetBinToHex(FileStream); finally FileStream.Free; end; end; end; procedure TForm1.Button1Click(Sender: TObject); begin Memo1.Lines.Add(BinToHexFromFile('..')); end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:32 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz