如何按十六或二进制读文件的内容,然后将读进来的十六进制内容转换为数字。 (题目修改,对误导的朋友说声抱歉) (100分)

  • 主题发起人 主题发起人 johnpan
  • 开始时间 开始时间
J

johnpan

Unregistered / Unconfirmed
GUEST, unregistred user!
你好,请教一个问题:
一个二进制文件,在某个位置有一个十六进制的数字,表示一个偏移量,我需要得到这个偏移量。但是,当我把这个十六进制数读进来后,不知道如何不让它表示为字符。请帮忙!谢谢
如: 文件内容(十六进制):
01 51 00 00 00 .....
在偏移 0151H位置有字符串要读。我想能把 01 51 读进来,不知道怎么得到 0151 这个值或相应的二进制数。
 
我写了一个小函数,试一下
//参数value必须为一个长度为4的字符串,如 '0151'
function ConvertHexToInt(value:string):integer;
var
arr:array [1..4] of integer;
i:integer;
begin
result:=0;
for i:=1 to 4 do
arr:=Byte(Value)-$30;
for i:=1 to 4 do
result:=result+ (arr shl (4-i)*4);
end;
 
在字符串前面加上“$”即为十六进制数,然后StrToInt转换一下即为十进制数。
 
可能我写的不大清楚。
01 51 是十六进制的内容,如果把它当成字符读进来会是' Q'。如何读进来是'0151'?
 
为什么要当成字串读进来?读二进制
 
我想读二进制应该是答案,但是怎么读二进制我不知道。希望不吝赐教。
 
好象用MOve()函数可以将一个二进制值转换为一个整数。
 
看看下面的行不行

function Test(AHex: integer): string;
var
i: integer;
str: string;
begin
str := IntToHex(AHex,0);
for i := 3 downto length(str) do
begin
str := '0'+str;
end;
result := str;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
i: integer;
begin
i := $0151;
edit1.Text := Test(i);
end;
 
当字符读近来后再转换一下不就可以了吗?
字符-》ASCII码-》十六进制数-》组合-》前加$-》转换成十进制
 
var
FileStream:TFileStream;
OffsetValue:WORD;

begin
FileStream:TFileStream.Create(....);
移动文件位
FileStream.ReadBuffer(OffsetValue,SizeOf(WORD));
FileStream.Destroy;
 
LittleIsland的方法可行,但是读出来的内容有点颠倒,比如应该是$0151,结果读出来的是$5101,两个字节颠倒了,怎么办?
还有如果以后要把这个内容写到文件里,是不是用类似的方法?
 

读出的结果是正常的。
也可以用BlockRead读取,BlockWrite写入,原理是一样。
 
多人接受答案了。
 
后退
顶部