php 操作二进制数据的问题!

rgmlkthh 2009-07-22 01:44:00
大家好.
我现在从服务器端通过socket接收到一些二进制数据,本来是寄希望通过unpack函数直接解析的.但现在有个问题是,服务器端给的数据格式大致是这样的len+content,这个len是后面content内容的长度,当然后面可能还有多个这样的数据.
我现在的问题是我在unpack的时候肯定要指定格式串,比如 $format = "sa*";其中s的值应该代表后面a的个数,比如s=5的话,那$format = "sa5",这样去解析,但是现在我无法先知道s的值,我想通过收取到的数据,直接截取前两个字节的内容,再将其解析,来指定后面a的值,但现在问题是在php里,咋个来操作呢,它又不像C里有memcpy函数可以截取二进制数据.麻烦哪位大哥帮忙看看,提提思路.谢谢.
我问问题,没有100分以下的.欢迎大家顶起!
...全文
1014 18 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
rgmlkthh 2009-07-30
  • 打赏
  • 举报
回复
呵,问题已解决,也得谢谢楼上的了.我正因为当初不知道substr可以直接截取二进制数据.
Gdj 2009-07-23
  • 打赏
  • 举报
回复
分2步走就是了。例如数据收在$buff里,长度占4字节的空间:
$len=array_shift(unpack("L",substr($buff,0,4)));
$data=unpack("sa{$len}",substr($buff,4));
yctin 2009-07-22
  • 打赏
  • 举报
回复
二进制数据 用 ASCII 数字表示长度?
这是什么设计? 我还是第一次见...
rgmlkthh 2009-07-22
  • 打赏
  • 举报
回复
在网上找了一个比较复杂的函数,好像还可以,正在紧张的调试中.希望大家继续出注意.
foolbirdflyfirst 2009-07-22
  • 打赏
  • 举报
回复
这样子,你是否能做一组供测试的数据,就是类似你现在从服务器端获取到的字符串.
比如5abcde,现在把这个5变成你实际接收到的数据.
光说好像的确说不太清楚呀..
rgmlkthh 2009-07-22
  • 打赏
  • 举报
回复
这样是不行的.
[Quote=引用 10 楼 yctin 的回复:]
bin2hex => bin2dec
[/Quote]
rgmlkthh 2009-07-22
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 foolbirdflyfirst 的回复:]
引用 7 楼 rgmlkthh 的回复:
关键是发回的数据是一个整体,咋个unpack返回一个16位的short型,你只用一个unpack("s",$buf);肯定是不对的啥,所以我只想取那一块的内存,就是找不到类似于memcpy的函数啊.
引用 5 楼 foolbirdflyfirst 的回复:
为什么不先用unpack返回一个16位的short型,在利用得到的值format进字符串.

比如现在你得到的串是PHPHPHPHPH
unpack("s","PHPHPHPHPH");返回的是整个串的前两个字节,即'PH'的对应的short型,你不是就是要这个么?
[/Quote]
这个肯定不行啥,s代表一个数字.打个比方,服务器发给我的字符串为5abcde,其中5代表的是紧接着的字符串的长度,我接收到数据时解析s对应前面的数字,a对应字符串,所以unpack('sa5',$buf);这样解析就对了啥,但是这里的5必须是在先知道这个字符串前面的那个short值时才行.这感觉有点矛盾一样.不知道我说清楚没.
yctin 2009-07-22
  • 打赏
  • 举报
回复
bin2hex => bin2dec
yctin 2009-07-22
  • 打赏
  • 举报
回复
$bytesOfLength = 2;

$length = bin2hex(substr($data,0,$bytesOfLength));
$content = substr($data,$bytesOfLength);


foolbirdflyfirst 2009-07-22
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 rgmlkthh 的回复:]
关键是发回的数据是一个整体,咋个unpack返回一个16位的short型,你只用一个unpack("s",$buf);肯定是不对的啥,所以我只想取那一块的内存,就是找不到类似于memcpy的函数啊.
引用 5 楼 foolbirdflyfirst 的回复:
为什么不先用unpack返回一个16位的short型,在利用得到的值format进字符串.

[/Quote]
比如现在你得到的串是PHPHPHPHPH
unpack("s","PHPHPHPHPH");返回的是整个串的前两个字节,即'PH'的对应的short型,你不是就是要这个么?
rgmlkthh 2009-07-22
  • 打赏
  • 举报
回复
关键是发回的数据是一个整体,咋个unpack返回一个16位的short型,你只用一个unpack("s",$buf);肯定是不对的啥,所以我只想取那一块的内存,就是找不到类似于memcpy的函数啊.
[Quote=引用 5 楼 foolbirdflyfirst 的回复:]
为什么不先用unpack返回一个16位的short型,在利用得到的值format进字符串.

[/Quote]
rgmlkthh 2009-07-22
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 yctin 的回复:]
http://blog.yctin.com/archives/how-to-get-name-table-from-ttf-font-file-using-php/

FYI
[/Quote]大哥,你这个打不开哦.能否再多说两句.
foolbirdflyfirst 2009-07-22
  • 打赏
  • 举报
回复
为什么不先用unpack返回一个16位的short型,在利用得到的值format进字符串.
rgmlkthh 2009-07-22
  • 打赏
  • 举报
回复
期待高手哇...
lonelyriver 2009-07-22
  • 打赏
  • 举报
回复
丿
fenyao 2009-07-22
  • 打赏
  • 举报
回复
顶起!

21,893

社区成员

发帖
与我相关
我的任务
社区描述
从PHP安装配置,PHP入门,PHP基础到PHP应用
社区管理员
  • 基础编程社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧