root:DWORD;
str:string;
buf:array[0..254] of DWORD;
p1:=$004abc;
str:="123"
root:=dword(@buf);
CopyMemory(Pointer(root),@p1,4);
CopyMemory(Pointer(root+4),pchar(str),length(str));
哪位精通C帮我用C写下这段
str:string;
buf:array[0..254] of DWORD;
p1:=$004abc;
str:="123"
root:=dword(@buf);
CopyMemory(Pointer(root),@p1,4);
CopyMemory(Pointer(root+4),pchar(str),length(str));
哪位精通C帮我用C写下这段
解决方案 »
- 急 在线等待 存储过程 insert into问题
- 关于报错为access violation at XXX in 'rtl100.bpl'的问题
- 请各位高手指点,怎样用Delphi写保存与查询BMP图像,求急!谢谢!
- 烦死人的Access Voilation错误
- 初學者簡單一問, 在線等待!!!!
- 帮忙解释下这条语句
- 谁能帮帮我<我找到后我再加100分>!!!!!我想找点(0BJECT INSPECTOR各单元的属性及功能)和(控件属性功能及如何应用)的书、案例
- 用Delphi怎样实现互联网共享数据 .(即连锁店管理) 实施方案
- 请教个小问题~~~~~~~~~~~~~~~
- 怎样将临时表中的数据一次过写进数据库中?
- 安装1stclass 遇到的问题
- Delphi开发实现监控QQ好友上线情况
DWORD buf[255];
char* psz = "123";
DWORD dwP1 = 0x00004abc;ZeroMemory(buf, sizeof(buf));
CopyMemory((void*)buf, (void*)&dwP1, sizeof(DWORD));
CopyMemory((void*)(buf + 1), (void*)psz, strlen(psz));
CopyMemory(Pointer(root),@p1,4);
CopyMemory(Pointer(root+4),pchar(str),length(str));CopyMemory(Pointer(root),@p1,4);此处root值为0x00004abc
CopyMemory(Pointer(root+4),pchar(str),length(str));root地址+4位置写入str root是指针
不是把0x00004abc内的信息复制到buf是把dwP1内容复制到buf
dwP1的值是0x00004abc,CopyMemory((void*)buf, (void*)&dwP1, sizeof(DWORD));之后buf[0]的值就是0x00004abc,有何疑问?
c中是有指针的算术运算的,Pointer(root+4)是把指针偏移4个字节,如果你是32位代码的话,就是偏移一个DWORD,在c中可以简化成buf + 1。
但这句我看不明白是什么意思,CopyMemory((void*)(buf + 1), (void*)psz, strlen(psz));,就是你的原意是什么我不太明白,你在&buf[1]处写入了一个字符串123,而buf是个DWORD的数组,编译器会认为&buf[1]处的4个字节为一个DWORD,这里的内存是这样的0x31323300,x86处理器是小尾序的,所以实际内存是0x00333231,可这有什么意义么?
要不就是我没理解lz的意思?代码也太少,不好判断。
var
root:DWORD;
i:Integer;
buf:array[0..254] of DWORD;
str:string;
ba,bb:DWORD;
begin
str:=“text”;
root:=dword(@buf); //dword转换让root当指针
for i:=0 to 254 do
begin
WritememDword(root+i,0); //root+i内存地址清零为什么看root+4操作
end;
pa:=$003abc;
CopyMemory(Pointer(root),@pa,4); //把003abc赋过去
CopyMemory(Pointer(root+4),pchar(str),length(str));//root+4字节地址写入字符串
_asm{
pushfd
mov eax,root
popfd
}
完整意思都注释给你了
root:=dword(@buf); //dword转换让root当指针
for i:=0 to 254 do
begin
WritememDword(root+i,0); //之前root存放buf指针的值目的
end;
CopyMemory(Pointer(root),@pa,4); //把003abc赋过去 CopyMemory(Pointer(root+4),pchar(str),length(str));//root偏移4字节地址写入字符串目的是为了下边读取用
_asm{
pushfd
mov eax,root//这里读root值也就是$003abc这个是一个地址
...下边还会读取root指针偏移4字节后的字符串 popfd
}
buf内存地址偏移4字节后就是蓝色部分123ssss是我写入的字符串
root:DWORD;
i:Integer;
buf:array[0..254] of DWORD;
str:string;
ba,bb:DWORD;
begin
str:=“text”;
root:=dword(@buf); //dword转换让root当指针
for i:=0 to 254 do
begin
WritememDword(root+i,0); //root+i内存地址清零为什么看root+4操作
end;
pa:=$003abc;
CopyMemory(Pointer(root),@pa,4); //把003abc赋过去
pa:=$003abcc;
CopyMemory(Pointer(root+4),@ba,4);
pa:=$003abccc;
CopyMemory(Pointer(root+8),@ba,4);
CopyMemory(Pointer(root+10),pchar(str),length(str));//root+4字节地址写入字符串
_asm{
pushfd
mov eax,root
popfd
}
问题就是在偏移上了如果他是4字节的那我如果偏移是10改怎么办?
CopyMemory((void*)(buf + 1), (void*)psz, strlen(psz)); //这里如何实现10的偏移了
DWORD 32位无符号整数对应到C++就是 unsigned long ?
root:=dword(@buf);等同于C++语句哪句?...
如果你要偏移10字节的话,必须把buf强制转换成char*或byte*,(char*)buf + 10
指针只是表明了一个内存起始地址,内存里是什么数据和指针的类型没什么关系,例如你可以将一个对象或者字符串的内存写入一个int类型的指针地址中,但是你自己要知道如何处理这段内存,因为它虽然是整形指针但并不是指向整数的(其实也可以说是指向整数,有点说不清楚,内存地址就是连续的字节,意会一下)。可是编译器总是认为int*就是指向整数的,它必须知道明确的类型,这样编译器才能知道数据的内存跨度,以便分配和释放内存,就像你定义的那个buf,是个DWORD*,所以给他分配255个元素时,编译器知道要分配4*255字节的内存,当buf+1时编译器也知道要跨过4字节,而且编译器总是认为buf中的每一个元素都是DWORD,虽然你在buf[1]中写入了一个3个字节的字符串,但编译器不会改变认为buf[1]是一个4个字节的DWORD的看法。
p话说了这么多,我觉得我也没说的太明白,不太好表达,你找本书看看吧。
DWORD buf[255];
char* psz = "123";
DWORD dwP1 = 0x00004abc;ZeroMemory(buf, sizeof(buf));
CopyMemory((void*)buf, (void*)&dwP1, sizeof(DWORD));
CopyMemory((void*)(buf + 1), (void*)psz, strlen(psz)); //这里要偏移10的话
这个数组的目的就是要开辟出一段内存让这段内存是连续的然后读取时根据写入的偏移类型去处理
问题不是在写入后会发生什么问题是我该如何对他每字节任意写入任意类型的数据
long a;
这样定义是可以满足a=是0x123abc str是字符串 可后边我没法读因为他的内存地址上不一定是一前一后
挨着的 挨着就只能用数组 我想做的就是开辟出一段连续的空间写入数据后根据自己的偏移来处理这段内存的数据
数组就是指针,指针就是数组,从内涵到外在表现形式都一样,你可以对数组解引用,你也可以对指针使用下标,指针和数组根本就是一个东西。只要内存是一次分配的,不管是malloc还是realloc,你所看到的内存就是连续的,因为你看不到物理地址,它的物理地址肯定不是连续的,你只能看到虚拟地址。
char* psz = "123";
DWORD dwP1 = 0x00004abc;ZeroMemory(buf, sizeof(buf));
CopyMemory((void*)buf, (void*)&dwP1, sizeof(DWORD));
CopyMemory((void*)(buf + 4), (void*)psz, strlen(psz)); //改成这样就是在0x00004abc后写入?或者应该怎么写 位置是写在00004abc后
byte* psz = "123";
DWORD dwP1 = 0x00004abc;ZeroMemory(buf, sizeof(buf));
CopyMemory((void*)buf, (void*)&dwP1, sizeof(DWORD));
CopyMemory((void*)(buf + 4), (void*)psz, strlen(psz)); //改成这样就是在0x00004abc后写入?或者应该怎么写 位置是写在00004abc后 不用char了 用byte应该怎么写
char* psz = "123";//字符串
DWORD dwP1 = 100;//32位整数
DWORDLONG dwlP2 = 1000;//64位整数
byte buf_a[50];//50个元素的byte数组,上面这些都给它写入buf中
char* pbuf = buf;//在定义一个pbuf,初始指向buf,这个指针要移动ZeroMemory(pbuf, sizeof(buf));
ZeroMemory(buf_a, sizeof(buf_a));buf_a[3] = 125;
CopyMemory((void*)pbuf, (void*)psz, strlen(psz));
pbuf += strlen(psz);
CopyMemory((void*)pbuf, (void*)&dwP1, sizeof(DWORD));
pbuf += sizeof(DWORD);
CopyMemory((void*)pbuf, (void*)&dwlP2, sizeof(DWORDLONG));
pbuf += sizeof(DWORDLONG);
CopyMemory((void*)pbuf, (void*)&buf_a, sizeof(buf_a));//读那个DWORDLONG,如果读取以字符方式存储的数字不能这么读,例如那个psz表示数字123时,
//一定要先以字符读出来再转换成数字,这里有个字节序的问题
DWORDLONG dwlP3 = *((DWORDLONG*)(buf + strlen(psz) + sizeof(DWORD)));
//读那个byte数组的第4个元素
byte nP4 = *((byte*)(buf + strlen(psz) + sizeof(DWORD) + sizeof(DWORDLONG) + 3 * sizeof(byte)));
CopyMemory((void*)pbuf, (void*)&buf_a, sizeof(buf_a));
多打了个&,应该是(void*)buf_a,如果不能编译就改成这样