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写下这段

解决方案 »

  1.   

    说的不太明确,假定你这段代码是32位代码,使用的是mbcs,假定p1是个DWORD,那这样
    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));
      

  2.   

     root:=dword(@buf);
    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是指针
      

  3.   

    CopyMemory((void*)buf, (void*)&dwP1, sizeof(DWORD));
    不是把0x00004abc内的信息复制到buf是把dwP1内容复制到buf
      

  4.   

    CopyMemory不就是复制内容么?实际上从这些代码看,你那个root没有必要,没有什么用处,他只是保存了个buf指针的值,直接用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的意思?代码也太少,不好判断。
      

  5.   


    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
    }
    完整意思都注释给你了
      

  6.   

    对不起先前没有做解释让您看这摸不到头脑下边是解释
    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
    }
      

  7.   

    目的就是下边读取root指针时 得到0x00004abc 读root指针偏移4个字节是字符串信息
      

  8.   

    如果那个root变量只是为了初始化buf的话就没必要了,见我给你的代码,ZeroMemory宏就是内存清零。按你说的,应该就是我给你的代码就可以了,如果你不是要vc++的代码,就把代码中的ZeroMemory和CopyMemory这两个宏替换成memset和memcpy,效果一样的。为啥不把buf定义为无类型的指针,不是更合理么?不过你这样定义为DOWRD数组也许有特殊的用处。
      

  9.   

    您给我的那段调试后输出root值不为0x00004abc
      

  10.   


    buf内存地址偏移4字节后就是蓝色部分123ssss是我写入的字符串
      

  11.   

    root的值本来就不会是0x00004abc的啊,你看你的代码root在取得buf的地址以后,root就再也没有被赋值过,它如何变?值0x00004abc是直接拷贝到了root的值所标示的内存地址,也就是buf的地址,而不是root这个变量自己的地址,0x00004abc这个值是拷贝到了buf的地址,也就是buf[0]是0x00004abc
      

  12.   

    问题是不是在这里DWORD类型C++里DWORD是2字节吗要是不是等同于DWORD2字节的数组在C++里是怎么定义?
      

  13.   

    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赋过去
      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++语句哪句?...
      

  14.   

    Quote: 引用 4 楼 bluekitty 的回复:

    CopyMemory不就是复制内容么?实际上从这些代码看,你那个root没有必要,没有什么用处,他只是保存了个buf指针的值,直接用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的意思?代码也太少,不好判断。 quote]你在&buf[1]处写入了一个字符串123而buf是个DWORD的数组,编译器会认为&buf[1]处的4个字节为一个DWORD
    这里您需要看
    CopyMemory(Pointer(root+4),pchar(str),length(str));//root+4字节地址写入字符串
    pchar(str)强制转成字符附给root+4的位置 这里之所以用CopyMemory和pchar()就是为了让&buf[1]地方是字符串类型而不是4个字节为一个DWORD
      

  15.   

    DWORD是Double WORD双字,32位无符号整数,当然是4字节,WORD是2字节。
    如果你要偏移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话说了这么多,我觉得我也没说的太明白,不太好表达,你找本书看看吧。
      

  16.   

    写入10字节的话这句话应该改写成什么样
    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的话
    这个数组的目的就是要开辟出一段内存让这段内存是连续的然后读取时根据写入的偏移类型去处理
    问题不是在写入后会发生什么问题是我该如何对他每字节任意写入任意类型的数据
      

  17.   

    char str[];
    long a;
    这样定义是可以满足a=是0x123abc str是字符串 可后边我没法读因为他的内存地址上不一定是一前一后
    挨着的 挨着就只能用数组 我想做的就是开辟出一段连续的空间写入数据后根据自己的偏移来处理这段内存的数据
      

  18.   

    如果要读任意位置,其实任何指针都可以访问它的内存的任意位置,但定义一个char*或byte*比较方便,他们的跨度都是1字节。
    数组就是指针,指针就是数组,从内涵到外在表现形式都一样,你可以对数组解引用,你也可以对指针使用下标,指针和数组根本就是一个东西。只要内存是一次分配的,不管是malloc还是realloc,你所看到的内存就是连续的,因为你看不到物理地址,它的物理地址肯定不是连续的,你只能看到虚拟地址。
      

  19.   

    char buf[255];
    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后
      

  20.   

    还是用byte*把
    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应该怎么写
      

  21.   

    还是上代码吧,这么简单的问题已经说太多了char buf[255];
    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)));
      

  22.   

    上面这一行,就是复制byte数组的哪一行
    CopyMemory((void*)pbuf, (void*)&buf_a, sizeof(buf_a));
    多打了个&,应该是(void*)buf_a,如果不能编译就改成这样
      

  23.   

    我的写法不是太规范,你应该每次向buf写数据时都检查会不会越界,防止缓冲区溢出