Packet:array[0..1000] of byte;type
  USHORT = WORD;
  ULONG = DWORD;
  time_t = Longint;TIPHeader = record
    iph_verlen:   UCHAR;    
    iph_tos:      UCHAR;    
    iph_length:   USHORT;   
    iph_id:       USHORT;   
    iph_offset:   USHORT;   
    iph_ttl:      UCHAR;    
    iph_protocol: UCHAR;    
    iph_xsum:     USHORT;   
    iph_src:      ULONG;    
    iph_dest:     ULONG;    
  end;
  TTCPHeader = record
    sourcePort: WORD;       
    destinationPort: WORD;  
    sequenceNumber: ULONG;    
    acknowledgeNumber: ULONG; 
    dataoffset: UCHAR;        
    flags: UCHAR;             
    windows: USHORT;          
    checksum: USHORT;         
    urgentPointer: USHORT;    
  end;
begin
Move(Packet[0], IPHeader, IPHeaderSize);
Move(Packet[IPHeaderSize], TCPHeader, TCPHeaderSize);
end;Packet:= 45 00 00 28 23 7A 00 00 80 06 2A BA C0 A8 01 0A 45 04 E5 E5  7E 55 00 50 28 37 68 3A 00 00 00 00 50 02 40 00 8B D0 00 00;IPHeader 读出来  完全正常 ;但TCPHeader 读出来却是相反的,比如TCPHeader.sourcePort 读出来是应该是7E 55 ,可是这样得到的却是55 7E各位大侠,这个应该怎么解决?

解决方案 »

  1.   

    这么说吧, 你必须了解一下bigendian 和little endian的区别,  如果说对方发来的数据是7E 55 的, 在你这边是不会变成557e的, move绝对不会做这种隐藏的事情,所以我很想知道你的557e如何看到的
      

  2.   

    我用了个Format
    LogData := Format(‘Destination vl : %2X’, [IPHeader.iph_verlen]);
    LogData := Format(‘Destination port : %2X’, [TCPHeader.sourcePort]);memo1.Text :=memo1.Text + LogData;显示为 Destination vl : 45 
           Destination port: 557E
      

  3.   

    TCPHeader.destinationPort 读出来是5000 ,本来应该是0050 才对。。IP包读出来的读出来都正确。。郁闷
      

  4.   

    TCPHeader.sourcePort = 557e 实际在内存里的位置就是7e55, Littleendian的处理方式就是低位在内存的低字节位置.557e, 7e是低位, 所以在内存里从小到大的顺序就是7e55,别人发来的字节码是7e55, 这是正确的
      

  5.   

    谢谢楼上这位兄弟这么晚了还帮小弟解答那这个要怎么把它弄回来呢?还有为什么IP头读出来顺序正确,而TCP头却反过来了呢?
      

  6.   

    IP 头解析的是正确那是因为你是把他当作字节码读取的, 而tcp中你定义的是Word,  转换的话你就自己对调位置即可啊 
      

  7.   


    procedure TForm1.Button3Click(Sender: TObject);
    var
     a : word;;  tt : array[0..1] of byte;
    begin
       tt[0] := 1;
       tt[1] := 2;
       move(tt[0],a,length(tt));
      self.Memo1.Lines.Add(IntToStr((PByte(Integer(@a))^)));
      self.Memo1.Lines.Add(IntToStr((PByte(Integer(@a)+1)^)));
      self.Memo1.Lines.Add(IntToStr(a))
    end;
    小端存放问题。lz研究下这个例子就会明白