字符的二进制,php的pack与unpack
$curl = curl_init ();
curl_setopt($curl, CURLOPT_URL , 'http://mh.18touch.com/restful/magic');
curl_setopt($curl, CURLOPT_PORT, 80);
//curl_setopt($curl, CURLOPT_CONNECTTIMEOUT_MS, 50);
//curl_setopt($curl, CURLOPT_TIMEOUT_MS, 50);
//curl_setopt($curl, CURLOPT_HEADER, true);
//curl_setopt($curl, CURLINFO_HEADER_OUT , true);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($curl, CURLOPT_FOLLOWLOCATION, 0);
curl_setopt($curl, CURLOPT_POST, true);
//$p_data=file_get_contents('xyl.zip'); $p_data ="test 123";
$data_length = strlen($p_data); for($i=0;$i<$data_length;$i++){
$byte[] = pack('H2',dechex(ord($p_data[$i])));
}
$str = implode('',$byte);
$data_length = strlen($str);
$p_data =$str; curl_setopt($curl, CURLOPT_HTTPHEADER, array("Content-Length: $data_length","Content-Type: application/octet-stream"));
curl_setopt($curl, CURLOPT_POSTFIELDS, $p_data);
//curl_setopt($curl, CURLOPT_NOBODY , true);
$a = curl_exec($curl);
//$b = curl_getinfo($curl);
var_dump($a);
上面通过截取包,发现里面的内容是一样的,都是传输的字符串test 123。如果把pack的打包改成h,就会使显示发送的是16进制表示的数,都是对应的字符串的十六进制数的高地位相反,47 67...,这样的序列构不成正确的http协议传输的ascii吗值所以显示为十六进制的表示形式,传递的还是二进制数。上面的字符串只是把二进制数表示为字符串了。
pack h 的意思是把后面的当16进制字符串,你传入整形12与字符串12是一样的。要求传入一个16进制内的字符。
为了避免混淆,我把“test 123”这样的字符串定义为表示型二进制字符串。
test123 对应的“10101010101010101010”这样的字符串定义为存储型二进制字符串。(要注意的是存储的肯定是二进制,而不是字符串!!)
上面的可以看做是表示型二进制字符串“t”,它的存储型字符串是“10010110”,它的二进制值是11010110。
所以http里只有二进制传输!
下面就是传输二进制的伪代码,其实底层传输的是其对应的存储层。
<?php
header("charset=utf-8;"); function StrToBin($str){
//1.列出每个字符
$arr = preg_split('/(?<!^)(?!$)/u', $str);
//2.unpack字符
foreach($arr as &$v){
$temp = unpack('H*', $v);
$v = base_convert($temp[1], 16, 2);
unset($temp);
} return join(' ',$arr);
} function BinToStr($str){
$arr = explode(' ', $str);
foreach($arr as &$v){
$v = pack("H".strlen(base_convert($v, 2, 16)), base_convert($v, 2, 16));
} return join('', $arr);
} echo StrToBin("里面23");
echo '<br/>';
echo BinToStr(StrToBin("里面23"));
unpack与ord类似,得到表示型字符串的底层二进制值,拿到二进制值会后,我们可以通过base_convert转化为存储型二进制字符串。
unpack('H*', '9') 的过程是先得到'9'的底层存储值ord('9')=112,然后按H的形式返回(又从二进制值变成表示型字符串),所以还要把进行dechex(112)=39;最后得到字符串‘9’的H表示为‘39’,返回array(1=>"39")。
他的意思是得到表示型字符‘9’的底层二进制值的H表示值“39”。上例的伪传输二级制又通过base_convert把H表示的字符串转化为B表示的字符串“00111001”
pack与chr类似,不过更高级,可以打包表示型字符串得到存储值,存储值其实就是二进制,他不是字符串~
strlen(base_convert(“00111001”, 2, 16)) = strlen(“39”) = 2
pack(“H2”,“39”)的意思是把H表示型字符串“39”打包成一个H格式的值及0x39 = 112 = 表示型字符“9”
这里的概念很容易搞晕~~~
简单的将,unpack拆包,得到存储值(或者直接拿pack打包后的结果,其实也是存储值),然后通过fomat来从重新包装表示。给一个pack打包的长串,根据fomat拆包为多个字段的表示。
pack组装,就是把给他的东西,按照fomat来转化为存储值。给多个就把存储值组装到一起!
存储值就是二进制数,在php手册里面叫binary string ,极其容易跟存储型表示的二进制字符串弄混~
字符的二进制,php的pack与unpack的更多相关文章
- pack、unpack自制二进制“数据库”
引言 pack.unpack函数,如果没有接触过socket,这个可能会比较陌生,这两个函数在socket交互的作用是组包,将数据装进一个二进制字符串,和对二进制字符串中的数据进行解包,这个里面有好多 ...
- Pytho, struct处理二进制(pack和unpack)
[转]Python使用struct处理二进制(pack和unpack用法) Leave a reply 转载自:http://www.cnblogs.com/gala/archive/2011/09/ ...
- Python使用struct处理二进制(pack和unpack用法)
转载自:http://www.cnblogs.com/gala/archive/2011/09/22/2184801.html 这篇文章写的很好,所以无耻的转了.. 有的时候需要用python处理二进 ...
- [PHP][位转换积累]之pack和unpack
一.前面的话 PHP的pack和unpack提供了为一系列数据打包(pack)和解包(unpack)成2进制流的功能,这个功能在面向字节的字符串处理和套接字的编程环境中尤为适用. 在了解这两个函数之前 ...
- php pack、unpack、ord 函数使用方法
string pack ( string $format [, mixed $args [, mixed $... ]] ) Pack given arguments into a binary st ...
- PHP pack和unpack函数详解
pack 压缩资料到位字符串之中. 语法: string pack(string format, mixed [args]...); 返回值: 字符串 函数种类: 资料处理 内容说明 本函数用来将资料 ...
- 浅谈PHP中pack、unpack的详细用法
转自:https://segmentfault.com/a/1190000008305573 PHP中有两个函数pack和unpack,很多PHPer在实际项目中从来没有使用过,甚至也不知道这两个方法 ...
- Python学习——struct模块的pack、unpack示例
he struct module includes functions for converting between strings of bytes and native Python data t ...
- perl中的pack与unpack
这个pack, unpack在 "perl语言编程" 有介绍 看起来很复杂 #把一个字符串转为十六进制格式 my $source = 'abcd'; unpack('H*', $s ...
- python函数参数的pack与unpack
python函数参数的pack与unpack 上周在使用django做开发的时候用到了mixin(关于mixin我还要写一个博客专门讨论一下,现在请参见这里),其中又涉及到了一个关于函数参数打包(pa ...
随机推荐
- windows eclipse IDE打开当前类所在文件路径
1. 展开如下菜单: Run ---- External Tools ---- External Tools Configurations 2. 在 program 下面新建一个工具 program- ...
- .NET在IE10下的回传BUG修复
以前我也没注意到,直到有次公司新配了台机器做测试服务器,在测试过程中意外发现凡是涉及PostBack的操作仅在IE10下都无效,其他版本浏览器都没有问题,本机调试也没有问题. 这也就是说在程序相同的情 ...
- C#: 线程间操作无效: 从不是创建控件“dataGridView”的线程访问它
最近在修改自动化小工具,用多线程来解决后台拷贝导致WinForm界面卡死的情况,但是遇到过错:线程间操作无效: 从不是创建控件“dataGridView”的线程访问它. 这是因为在多线程程序中,新创建 ...
- EF学习笔记-1 EF增删改查
首次接触Entity FrameWork,就感觉非常棒.它节省了我们以前写SQL语句的过程,同时也让我们更加的理解面向对象的编程思想.最近学习了EF的增删改查的过程,下面给大家分享使用EF对增删改查时 ...
- UE4随笔 二 第一印象
打开UE4,短暂的兴奋过后,开始大概扫一扫UE4的编辑器,整个界面比UE3更有现代气息: 之前看其他人写的文章,虚幻4最重要的改动集中在下面几个方向上: 跨平台: WIN和MAC平台都能使用,这就意味 ...
- 日常一些出现bug的问题
1.Fatal signal 4 (SIGILL), code 1, fault addr 0xca31569e in tid 8033 (r.myapplication) fault addr : ...
- jzoj5928
tj:題解裡公式是錯的 我們可以考慮每一個節點[a,a+2^b-1]對答案的貢獻 則當這個節點是左兒子時,貢獻為2^b 是右兒子時,貢獻為2n−a−2b+12^n-a-2^b+12n−a−2b+1 左 ...
- Nexus3.6 window版私服搭建 安装、配置教程
1.本地环境配置(Nexus3.6支持jdk版本1.6.1.7.1.8) 1.1.官网下载地址:https://www.sonatype.com/download-oss-sonatype ...
- 【JS深入学习】——事件代理/事件委托
事件代理/事件委托(event delegation) 需求一:当一个div内部有多个事件发生,给每个元素逐个添加事件十分麻烦... 需求二:在项目中我们常常需要动态的添加元素,不可避免的需要为那些未 ...
- 安装Apache时端口号被占用解决方案
有些朋友的电脑在安装Apache是会遇到端口冲突的问题.以下是一种解决方案 1.打开控制面板的管理工具 2.打开IIS 3.观察网站下的端口号 4.点击绑定 5.更改端口号 6.重新启动即可