比较麻烦,可用unpack函数1、你应该知道该结构的定义(每个成员的类型)
2、读取内容到串,依成员的类型截取相应长度的串到变量。串类型以"\0"结束
3、将截取到的非串类型的变量逐一用unpack函数依其类型进行解压。
unpack函数的参数请参见手册。其返回的是一个变异的数组而不是手册上说的是串,要用each取回

解决方案 »

  1.   

    xuzuning(唠叨) :
    我已经想到会比较麻烦了,谢谢!
    如果我按结构的定义用php组成一个结构,
    是不是没个元素的后边也得不‘\0’呀(如果值的长度不够的话)?我会按你说的方式去测试
    如果可行的话我多给你分:200
    :)))
      

  2.   


    xuzuning(唠叨) :我看了一下手册
    好像pack()函数可以实现导二进制的转化
    是码?我再看看
    以前我没用到这方面有问题再问你:)
      

  3.   

    对pack和unpack是一对互逆函数
    串后面的"\0"不能少,否则c不知道在哪里结束
      

  4.   

    我明白
    c也是我写的我刚刚看了pack 和 unpack假设我有一个二进制刘,表示结构{char(5),int}
    可不可以这样$resultArray = unpack("c5/n",$binData);
    这样$resultArray[0]就是5为的字符数组了
    而$resultArray[1]就是一个int数了?
    相反$a = "aa"."\0\0\0";
    $b = 2;
    $binData = pack("cn", $a, $b);
    是不是这样?
      

  5.   

    还有:
    和这个过程相反的怎么写,也就是说怎样把一个字符串变成一个二进制流啊,
    比如字符串是“abcdefghijklmnopqrst”,
    那他变成二进制流的样子是什么/
    还有:有没有谁用过php的socket函数,我看手册上写的是本扩展模块是实验性的。
      

  6.   

    没用过socket函数
    不过我也看了,手册上好像很简单
    如果要用导网络上的数据连接和控制的话
    我提议还是用c比较号pack函数我还在测试中
    过量天再给大家分
    不要急:)
      

  7.   

    [原创] php和c通过socket通信--udp篇 
     thinmonkey 发表于 2003-9-8 14:57 PHP ←返回版面          [快速返回] 
     
    /*server.c*/
    #include <sys/types.h>
    #include <sys/socket.h>
    #include <string.h>
    #include <stdio.h>
    #include <netinet/in.h>
    #include <arpa/inet.h>
    #include <stdlib.h>
    #include <unistd.h>
    #include <errno.h>main(){
        int sock;
        struct sockaddr_in server,client;
        int recvd,snd;
        int structlength;
        char * server_ip = "128.168.10.1";/*server ip address*/
        int port = 8888;
        char recvbuf[2000],sendbuf[2000];        char str1[]="I have received:\n";    memset((char *)&server,0,sizeof(server));
        server.sin_family = AF_INET;
        server.sin_addr.s_addr = inet_addr(server_ip);
        server.sin_port = htons(port);
        memset((char *)&client,0,sizeof(client));
        client.sin_family = AF_INET;
        client.sin_addr.s_addr = htonl(INADDR_ANY);
        client.sin_port = htons(port);
            if((sock = socket (AF_INET,SOCK_DGRAM,0)) < 0 ){
            printf("socket create error!\n");
            exit(1);
        }    
        structlength = sizeof(server);
        if( bind(sock,(struct sockaddr *) &server,structlength) < 0){
            printf("socket bind error!\n");
            perror("bind");
            exit(1);
        }    while(1){
            structlength = sizeof(client);    
                
            printf("waiting.......\n");
            recvd = recvfrom(sock,recvbuf,sizeof(recvbuf),0,
                (struct sockaddr *) & client,&structlength);
            if(recvd < 0){
                perror("recvfrom"); 
                exit(EXIT_FAILURE);    
            }
            else{
                printf("received:%s\n",recvbuf);
            
                memset(sendbuf,0,strlen(sendbuf));
                memcpy(sendbuf,str1,strlen(str1));
                        
                snd = sendto(sock,sendbuf,strlen(str1),0,
                (struct sockaddr *) &client,structlength);            if(snd < 0){
                perror("sendto");
                exit(1);
                }
                printf("sendok!\n");        }
            
            
        }    
            
        close(sock);
    }
    /*
    gcc -o server server.c生成server程序,在服务器端运行./server
    */
    /*client.php*/<?php
    $server_ip="128.168.10.1";
    $port = 8888;$sock=@socket_create(AF_INET,SOCK_DGRAM,0);if(!$sock){    echo "socket create failure";}if($buf=="")    $buf="hello,how are you!\n";if(!@socket_sendto($sock,$buf,strlen($buf),0,"128.168.10.1",8888)){    echo "send error\n";    socket_close($sock);    exit();}$buf="";
    $msg="";if(!@socket_recvfrom($sock,$msg,256,0,&$server_ip,&$port)){    echo "recvieve error!";    socket_close($sock);    exit();}echo trim($msg)."\n";socket_close($sock);?>
    <form action="client.php" method="post">
    <input type=text name=buf>
    <input type=submit value="submit">
    </form>/*这个过程很简单,就是客户端提交一个信息,服务端接收,
    并返回给客户端一个"接收到"的确认信息。
    */
      

  8.   

    $a = "aaa";
    $b = pack("l", 222222);
    $c = unpack("l", $b);
    echo $a."<br>--".$b;怎么输出的是
    aaa
    --d???
      

  9.   

    xxu(焕兄) :对呀,我的问题就是上边开始说的
    从一个二进制的结构体(幼c程序保存在数据库中的结构体)解析出各个元素的值
    而且要用php构建一个这样的结构体,在保存到数据库里
      

  10.   

    1、pack后,值由字面形式转换成了二进制
      "A" ==> 01000001
      0 ==> 00000000
      "0" ==> 00110000
      这是计算机基础问题,不应在这里讨论吧?
    2、unpack说明很少,且不易使用。建议直接按字节取出然后组装
    3、程序间的数据交换应采用字面方式,而不宜使用依赖操作系统的二进制方式
      如串:"abcd 123456 haha"
    php
    读取
    $s = "abcd 123456 haha";
    sscanf($s,"%s %d %s",$a[0],$a[1],$a[3]);
    写入
    $o = sprintf("%s %d %s",$a[0],$a[1],$a[3]);c
    假定结构
    struct {
      char *s1;
      int n;
      chr *s2;
    } tags;
    struct tags pp;
    读取
    char s[] = "abcd 123456 haha";
    sscanf(s,"%s %d %s",pp.s1,&pp.n,pp.s2);
    写入
    sprintf(o,"%s %d %s",pp.s1,pp.n,pp.s2);这样并不麻烦,书写形式上也很相似。本来php就是从c来的嘛。
      

  11.   

    和和
    不好意思,还有点疑问
    假定结构
    struct {
      char s1[4];
      int n;
      char s2[4];
    } tags;
    struct tags pp;
    读取和写入下边的字串怎么做(不知道分割服在那)
    char s[] = "abcd123456haha";