plongint是个指针,返回LONGINT型指针吧

解决方案 »

  1.   

    PLongInt应该是一个LongInt型的指针,
    把rpack.Buf转换成PLongInt
    然后取他的值?不太清楚帮你up
      

  2.   

    PLongInt=^Integer;
    把Buf缓冲区强制转换成LongInt的值。相当于把Buf[0],Buf[1],Buf[2],Buf[3]组合到一起,转换成一个LongInt的类型的值。
      

  3.   

    我再说明下:这个buf是4字节的,而且就是包含包长度的数据。
    那么,为什么是用:rpack.packlen :=  PLongInt(rpack.Buf)^
    而不用:          rpack.packlen :=  LongInt(rpack.Buf)
    为什么非要用指针类型?
      

  4.   

    应该是你理解上的错误,实际上应该是在Buf这个缓冲区里定义了自己的报文
    结构,前面4个字节为数据包长度,后面为其他数据,这样接受到数据时,先取
    缓冲区的前4个字节,就能够得到数据包的长度,这样便于后面的通讯处理以及
    校验等等。
      

  5.   

    意思我知道了,只是不明白为什么要这样接。
    对方发送了一个4字节的东西,是个长整型。
    我用了个pchar来接受,但是调试的时候看到这个pchar的数值是"<"之类的怪字符,而
    不是想象中的"1234"之类的数据。非要我用Plongint(..)^把它转一下才能看到正确的数值。
    大哥能说说原因?是按字符发送方式和按其他方式发送的数据,看到的会不一样的吗?
      

  6.   

    rpack.Buf是个指针,转换成PLongInt后再从该指针所指地址取出LongInt值(用^)。
    比方说AAA是一指针,AAA^就是AAA所指地址存放的值。
      

  7.   

    赞同gzmhero(hihihi)
    integer要占用4个byte,也就是说4个byte合在一起才能表示一个integer类型的数字,要是你只看其中的一个byte,当然只能看到怪码啦要看到字符,就按字符发呀
      

  8.   

    rpack.Buf是一个指向一片内存缓冲区的指针,这片内存的头四个字节表示一个长度。如果用 LongInt(rpack.Buf)只能是把一个指针值转换为一个整型值,而
    PLongInt(rpack.Buf)是把一个字符指针转换成了整型数指针,以便
    PLongInt(rpack.Buf)^
    取得那四个字节表示的整型数(长度)。你调试时看见了pchar的数值是"<"之类的怪字符是因为rpack.Buf的类型是pchar,Delphi的调试器自然把它看成了字符指针,缓冲区里面含有各种各样的字节值,如"<"的ASCII值60,然后按字符的方式显示了出来。pchar是一个比较通用的表示缓冲区的中间类型,就象在早期的C程序中多用char *来表示内存一样(malloc返回char *类型),但实际上这片内存是有结构的(比如说,前四个字节表示长度,而后是缓冲区的内容,其长度由头四个字节决定)。另外,你是在编socket程序,socket库是用C来实现的,而其缓冲区就是用char *来表示,在C中,以字符指针指向的缓冲区并无什么标志来表示其结束的地方(如果是字符串,可以以'\0'结尾,但一般的数据缓冲区内容可能包含了这个数,所以无法以它来作为结尾),因此需要一个长度值来指示,并保证不会存取越界。说得比较罗索,呵呵。