以下改写目标程序的Delphi程序有一句看不懂,请指点,谢谢
procedure TForm1.Button1Click(Sender: TObject);
var
vFS : TFileStream;
vStr : String;
begin
vStr := '1234';
vFs := TFileStream.Create('C:\我的测试.jpg',fmOpenReadWrite);
try
vFS.Position := $400;
vFS.WriteBuffer(pointer(vStr)^,4); ================>这句不明白
finally
FreeAndNil(vFS);
end;
end;
确实写入了四个字节,用WinHEX对比了下,却是:
1. C:\5221115.png: 136,794 字节
2. C:\我的测试.png: 136,794 字节
Offsets: 16进制
400: 83 31
401: 42 00
402: 9D 32
403: DC 00
4 differencesMatch(es) detected.
比如 要写入b0 01 c3呢? 本帖最后由 冥界3大法王 于 2021-12-23 13:50 编辑
成功了是成功了,但现在不明白,一一对应的关系。{:301_1008:}
求先生教我。{:301_974:}
参考:https://bbs.csdn.net/topics/300050929
https://bbs.csdn.net/topics/350111052?list=6045087
https://zhidao.baidu.com/question/24283762.html 在文件$400的位置,写了4个字符
要写vStr := 'b0 01 c3'; 中间有两空格 所以要改成
vFS.WriteBuffer(pointer(vStr)^,8); 本帖最后由 tywolf 于 2021-12-23 14:20 编辑
这个程序只是简单的往一个文件里指定的地址写入您想要的东西(字符串?二进制文件?资源文件等)
WriteBuffer是写入多少字节的内容到指定的起始地址位置
Position中文直译是定位的意思,也就是将文件流的指针定位到某个地址
$符号在delphi里是十六进制地址的意思,#符号在Delphi里是十进制地址的意思
在这个DEMO里,你如果想要修改写入的内容,只需要修改vStr变量对应的字符串,然后修改一下writebuffer函数的写法,就可以随意修改vstr的写入内容也不用数
writebuffer(pointer(vStr)^,sizeof(vstr));
应该可直接写Hex数据($)或Hex数组,不需要string类型 要写入b0 01 c3呢最好使用字节数组,更方便,你上面写入的是、“12”,应该编码不同,所以都带了00,字节数组就不会这样 本帖最后由 pzx521521 于 2021-12-23 16:13 编辑
对二进制修改很少用string 所有语言对应的都是Byte
string 对用的是unicode 就是 widechar 对应2个Byte, 如果不想要00 写 ansistring 或者ansichar 转一下
delphi 的string 是很特殊的下标从开始, 你可以百度 "delphi stirng byte"自己转一下就知道stirng byte之间的关系了
procedure TForm5.btn1Click(Sender: TObject);
var
vFS : TFileStream;
a : TBytes;
begin
vFs := TFileStream.Create('C:\Users\Administrator\Desktop\新建文本文档.txt',fmOpenReadWrite);
try
vFS.Position := 0;
SetLength(a, 3);
a := $B0; //b0
a := $01; //01
a := $c3; //c3
vFS.WriteBuffer(a, Length(a)); //a指向首地址
finally
FreeAndNil(vFS);
end;
end;
https://s2.loli.net/2021/12/23/QKY3N5sAGFtWoXe.png 本帖最后由 冥界3大法王 于 2022-1-8 22:59 编辑
sdzzb 发表于 2021-12-23 15:05
应该可直接写Hex数据($)或Hex数组,不需要string类型
@sdzzb
但是问题来了,我想用Edit1.Text上面用于接收输入的机器码
@tywolf
writebuffer(pointer(vStr)^,sizeof(vstr));
不报错,输出结果也不对
@pzx521521
找来一堆还是折腾不明白,折腾一天,实在是太笨了。
var
vFS : TFileStream;
a : TBytes;
begin
vFs := TFileStream.Create(sEdit1.text,fmOpenReadWrite);
try
vFS.Position := $843; //后面这个赋值Edit1就出问题了;我要实现的效果是ComboBox1中用于存放各种类型的机器码。。。批量输出
SetLength(a, Length(E2.Text) div 2); //后面是写入的长度
a := $EB; //后面这里转换成字节数组不会;多行更傻了,难道把字符串 拆成 字节用个for 遍历字节数组?
a := $07;
vFS.WriteBuffer(a, Length(a)); //a指向首地址
finally
FreeAndNil(vFS);
end;
end;
实在是太饭桶了,还请师傅给个实现的代码吧。{:301_974:}
唉。。。 https://newbedev.com/delphi-convert-byte-array-to-string这个有用吗? 你想要什么效果?
比如字符串'1234'对应的是byte数组(Buffer)应该是是什么?
正常的应该是(ASCII)
var
a : TBytes;
I: Integer;
s: string;
begin
s := edt1.Text;
SetLength(a, Length(s));
for I := 1 to Length(s) do//string 是从1开始的
begin
a := Ord(s)
end;
end;
页:
[1]
2