比较麻烦,可用unpack函数1、你应该知道该结构的定义(每个成员的类型)
2、读取内容到串,依成员的类型截取相应长度的串到变量。串类型以"\0"结束
3、将截取到的非串类型的变量逐一用unpack函数依其类型进行解压。
unpack函数的参数请参见手册。其返回的是一个变异的数组而不是手册上说的是串,要用each取回
2、读取内容到串,依成员的类型截取相应长度的串到变量。串类型以"\0"结束
3、将截取到的非串类型的变量逐一用unpack函数依其类型进行解压。
unpack函数的参数请参见手册。其返回的是一个变异的数组而不是手册上说的是串,要用each取回
我已经想到会比较麻烦了,谢谢!
如果我按结构的定义用php组成一个结构,
是不是没个元素的后边也得不‘\0’呀(如果值的长度不够的话)?我会按你说的方式去测试
如果可行的话我多给你分:200
:)))
xuzuning(唠叨) :我看了一下手册
好像pack()函数可以实现导二进制的转化
是码?我再看看
以前我没用到这方面有问题再问你:)
串后面的"\0"不能少,否则c不知道在哪里结束
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);
是不是这样?
和这个过程相反的怎么写,也就是说怎样把一个字符串变成一个二进制流啊,
比如字符串是“abcdefghijklmnopqrst”,
那他变成二进制流的样子是什么/
还有:有没有谁用过php的socket函数,我看手册上写的是本扩展模块是实验性的。
不过我也看了,手册上好像很简单
如果要用导网络上的数据连接和控制的话
我提议还是用c比较号pack函数我还在测试中
过量天再给大家分
不要急:)
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>/*这个过程很简单,就是客户端提交一个信息,服务端接收,
并返回给客户端一个"接收到"的确认信息。
*/
$b = pack("l", 222222);
$c = unpack("l", $b);
echo $a."<br>--".$b;怎么输出的是
aaa
--d???
从一个二进制的结构体(幼c程序保存在数据库中的结构体)解析出各个元素的值
而且要用php构建一个这样的结构体,在保存到数据库里
"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来的嘛。
不好意思,还有点疑问
假定结构
struct {
char s1[4];
int n;
char s2[4];
} tags;
struct tags pp;
读取和写入下边的字串怎么做(不知道分割服在那)
char s[] = "abcd123456haha";