pushad
    push p
    call address
    popadp是封包数据,原本是有3个int的数组,但是传进去的时候要变成“2148000000=80 07 E1 00-->00 E1 07 80”这样的反向,所以就发帖子询问逆向输出的问题:
http://community.csdn.net/Expert/topic/5576/5576774.xml?temp=.5142786但是现在要传进去的数据比较大,是1~20位int不定长的,如果再用上帖中的函数转换,就不太容易做了。
而且听说“这样的不用转换,读到内存的时候是会自己高低反的”,不过我不太明白,就再来问问,的确有简单的方法吗?

解决方案 »

  1.   

    比较笨的办法
    var
    buf1,buf2:array[0..255] of byte
    i,n:integer;
    begin
    //buf1赋值略...
    n:=low(buf1);
    for i:=high(buf1) downto low(buf1) do begin
    buf2[n]:=buf1[i];
    inc(n);
    end;
    ....
    ....
    end
      

  2.   

    2148000000这个数,也就是$8007E100,在内存中的确是按00 E1 07 80这样的顺序存放的(从低到高)。
    所以你若要将放到数组里发送出去,只需要:var
      i: Integer;
      L: DWORD;
      BA: array of Byte;
    begin
      L := 2148000000;
      SetLength(BA, SizeOf(L));
      PDWORD(@BA[0])^ := L;
      for i:=0 to High(BA) do
        ShowMessage(IntToHex(BA[i], 2));  // 依次显示00、E1、07、80
    end;要不要反向,你再考虑一下。
      

  3.   

    delphi的内存,硬盘数据都是这样,高位在右,低位在左,直接用指针操作就行了,
    如,00   E1   07   80 用PLONGINT(ADDRESS)^,出来的就是2148000000=80   07   E1   00
      

  4.   

    function ByteSwap(value:DWORD):DWORD; assembler;
    asm
      BSWAP eax
    end;
      

  5.   

    呵呵,其实也就是字节顺序啦(Little Endian和Big Endian)
    网络传输时对于自定义结构中的整型、浮点等类型确实需要注意。
      

  6.   

    winsock api 函数 htonl, htons, ntohs等, 查查msdn