gpt4 book ai didi

delphi - 文件的十六进制 View

转载 作者:行者123 更新时间:2023-12-03 15:15:02 25 4
gpt4 key购买 nike

我使用的是 Delphi 2009。

我想查看备忘录中的文件内容(十六进制)。

我正在使用此代码:

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;

当我将变量“s”声明为char(我知道char最多可达255)时,我得到的结果十六进制值高达65535!

当我将变量“s”声明为bytechr (0)..255时,它输出不同的十六进制值,与任何十六进制编辑器!

这是为什么呢?我怎样才能看到正确的值?

检查图像是否存在差异。

第一张图片:专业十六进制编辑器。

Professional Hex Editor

第二张图片:函数输出到备忘录。

Marked value should be 255 (box character)

谢谢。

最佳答案

您的 Delphi 2009 支持 unicode,因此 Char 实际上是 WideChar,它是一个 2 字节、16 位无符号值,可以具有从 0 到 65535 的值。

您可以将所有 Char 声明更改为 AnsiChar,并将所有 String 声明更改为 AnsiString,但那是不是这样做的方法。您应该放弃 Pascal I/O,转而使用基于流的现代 I/O,使用 TFileStream,并且不要将二进制数据视为 Char

控制台演示:

program Project26;

{$APPTYPE CONSOLE}

uses SysUtils, Classes;

var F: TFileStream;
Buff: array[0..15] of Byte;
CountRead: Integer;
HexText: array[0..31] of Char;

begin
F := TFileStream.Create('C:\Temp\test', fmOpenRead or fmShareDenyWrite);
try
CountRead := F.Read(Buff, SizeOf(Buff));
while CountRead <> 0 do
begin
BinToHex(Buff, HexText, CountRead);
WriteLn(HexText); // You could add this to the Memo

CountRead := F.Read(Buff, SizeOf(Buff));
end;
finally F.Free;
end;
end.

关于delphi - 文件的十六进制 View ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6304896/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com