php主机字节序和网络字节序_sole_cc的博客-CSDN博客_php 网络字节序


本站和网页 https://blog.csdn.net/sole_cc/article/details/52016455 的作者无关,不对其内容负责。快照谨为网络故障时之索引,不代表被搜索网站的即时页面。

php主机字节序和网络字节序_sole_cc的博客-CSDN博客_php 网络字节序
php主机字节序和网络字节序
sole_cc
于 2016-07-24 22:01:51 发布
3211
收藏
文章标签:
php
socket
PHP
专栏收录该内容
52 篇文章
0 订阅
订阅专栏
使用php编写socket程序时,也需要注意主机字节序和网络字节序的转换
主机字节序就是我们平常说的大端和小端模式:不同的 CPU 有不同的字节序类型,这些字节序是指整数在内存中保存的顺序 这个叫做主机序。Big-Endian和Little-Endian。引用标准的Big-Endian和Little-Endian的定义如下:   a) Little-Endian就是低位字节排放在内存的低地址端,高位字节排放在内存的高地址端。   b) Big-Endian就是高位字节排放在内存的低地址端,低位字节排放在内存的高地址端。
例子:在内存中双字0x01020304(DWORD)的存储方式 内存地址 4000 4001 4002 4003 LE 04 03 02 01 BE 01 02 03 04
网络字节顺序是指TCP/IP中规定好的一种数据表示格式,它与具体的CPU类型、操作系统等无关,从而可以保证数据在不同主机之间传输时能够被正确解释。网络字节顺序采用big endian排序方式。字节序,顾名思义字节的顺序,就是大于一个字节类型的数据在内存中的存放顺序,一个字节的数据没有顺序的问题了。
为了进行转换 bsd socket 提供了转换的函数 有下面四个   htons 把 unsigned short 类型从主机序转换到网络序   htonl 把 unsigned long 类型从主机序转换到网络序   ntohs 把 unsigned short 类型从网络序转换到主机序   ntohl 把 unsigned long 类型从网络序转换到主机序   在使用 little endian 的系统中 这些函数会把字节序进行转换   在使用 big endian 类型的系统中 这些函数会定义成空宏 注意:   1 、网络与主机字节转换函数 :htons ntohs htonl ntohl (s 就是 short l 是 long h 是 host n 是 network)   2 、不同的 CPU 上运行不同的操作系统,字节序也是不同的
在网络程序开发时 或是跨平台开发时 也应该注意保证只用一种字节序 不然两方的解释不一样就会产生bug. PHP中并没提供htons,htonl功能的函数,在进行网络通信时,可以通过
string pack ( string $format [, mixed $args [, mixed $... ]] ) array unpack ( string $format , string $data )
进行编解码 其中,format 可以取下面的值:
Code     Description a     NUL-padded string A     SPACE-padded string h     Hex string, low nibble first H     Hex string, high nibble first c     signed char C     unsigned char s     signed short (always 16 bit, machine byte order) S     unsigned short (always 16 bit, machine byte order) n     unsigned short (always 16 bit, big endian byte order) v     unsigned short (always 16 bit, little endian byte order) i     signed integer (machine dependent size and byte order) I     unsigned integer (machine dependent size and byte order) l     signed long (always 32 bit, machine byte order) L     unsigned long (always 32 bit, machine byte order) N     unsigned long (always 32 bit, big endian byte order) V     unsigned long (always 32 bit, little endian byte order) f     float (machine dependent size and representation) d     double (machine dependent size and representation) x     NUL byte X     Back up one byte Z     NUL-padded string (new in PHP 5.5) @     NUL-fill to absolute position
网络通信 比如现在要通过PHP发送数据包到服务器来登录。在仅需要提供用户名(最多30个字节)和密码(md5之后固定为32字节)的情况下,可以构造如下数据包(当然这事先需要跟服务器协商好数据包的规范,本例以网络字节序通信): 包结构:
字段  字节数 说明 包头  定长         每一个通信消息必须包含的内容 包体  不定长 根据每个通信消息的不同产生变化
其中包头详细内容如下:
字段               字节数 类型       说明 pkg_len         2     ushort     整个包的长度,不超过4K version         1     uchar     通讯协议版本号 command_id 2     ushort     消息命令ID result         2     short     请求时不起作用;请求返回时使用
当然实际中可能会涉及到各种校验。本文为了简单,只是列举一下通常的工作流程及处理的方式。 登录(执行命储1001)
字段       字节数 类型         说明 用户名 30     uchar[30] 登录用户名 密码         32     uchar[32] 登录密码
包头是定长的,通过计算可知包头占7个字节,并且包头在包体之前。比如用户陈一回需要登录,密码是123456,则代码如下:
<?php $version    = 1; $result     = 0; $command_id = 1001; $username   = "陈一回"; $password   = md5("123456"); // 构造包体 $bin_body   = pack("a30a32", $username, $password); // 包体长度 $body_len   = strlen($bin_body); $bin_head   = pack("nCns", $body_len, $version, $command_id, $result); //result为什么使用了主机字节序 $bin_data   = $bin_head . $bin_body; // 发送数据 // socket_write($socket, $bin_data, strlen($bin_data)); // socket_close($socket);
转自:http://www.kongqingquan.com/archives/24
参考:http://www.cnblogs.com/andydao/p/4200662.html
sole_cc
关注
关注
点赞
收藏
评论
php主机字节序和网络字节序
使用php编写socket程序时,也需要注意主机字节序和网络字节序的转换主机字节序就是我们平常说的大端和小端模式:不同的 CPU 有不同的字节序类型,这些字节序是指整数在内存中保存的顺序 这个叫做主机序。Big-Endian和Little-Endian。引用标准的Big-Endian和Little-Endian的定义如下:  a) Little-Endian就是低位字节排放在内存的低地址端
复制链接
扫一扫
专栏目录
php 基于标准的DES CBC模式的加密算法 int大端字节
10-20
所有协议数据的明文需要在尾部加上原始数据长度(int大端字节数4字节,协议数据的长度),再加上“ABCD”4个字母,然后按64位进行分组,不足64位的以“\0”补足,分组后的明文采用统一的加密方式生成密文,即采用 “明文+密钥+初始化向量(VI)”。
网络编程:完成广播代码
最新发布
m0_73943160的博客
11-23
/端口号(客户端主机端口号转为网络字节序)sin.sin_addr.s_addr =inet_addr(SIN_IP);//端口号(主机端口号转为网络字节序)//广播端口号(主机端口号转为网络字节序)sin.sin_addr.s_addr =inet_addr(IP);//2、绑定广播IP地址、端口号和套接字的文件描述符上。//客户端的端口号和主机IP。
参与评论
您还未登录,请先
登录
后发表或查看评论
网络字节序和主机字节序详解!!!
热门推荐
L未若的博客
02-24
3万+
我们都知道,如今的通讯方式已经趋向与多样化,异构通信(计算机软件(操作系统) + 计算机硬件(内核架构,ARM,x86)不同)也已经很普遍了,如,手机和电脑中的qq进行通信,,,
同时,在计算机设计之初,对内存中数据的处理也有不同的方式,(低位数据存储在低位地址处或者高位数据存储在低位地址处),然而,在通信的过程中(ISO/OSI模型和TCP/IP四层模型中),数据被一步步封装(然
php 主机序和网络序转换 (ntohl、htonl、ntohs、ntohs)
weixin_34208185的博客
12-06
489
为什么80%的码农都做不了架构师?>>>
...
PHP中pack、unpack的详细用法
weixin_33804582的博客
02-10
150
PHP中有两个函数pack和unpack,很多PHPer在实际项目中从来没有使用过,甚至也不知道这两个方法是用来干嘛的。这篇文章来为大家介绍一下它俩到底是用来干啥的。
pack
string pack ( string $format [, mixed $args [, mixed $... ]] )
该函数用来将对应的参数($args)...
php 小字节序,低字节序和高字节序相互转换(Little Endian/Big Endian) [C#]
weixin_39614060的博客
04-07
209
这个例子展示了如何转换整形数字的字节顺序,该方法可以用来在little-endian和big-endian之间转换。说明:Windos(x86,x64)和Linux(x86,x64)都是little-endian操作系统Big-Endian:一个WORD中的高位的Byte放在内存中这个WORD区域的低地址处。Little-Endian:一个WORD中的低位的Byte放在内存中这个WORD区域的低地...
php 字节序,php字节序转换的方法
weixin_35916663的博客
03-10
422
php字节序转换的方法:1、使用“htons”方法把unsigned short类型从主机序转换到网络序;2、使用“htonl”把“unsigned long”类型从主机序转换到网络序等。php主机字节序和网络字节序使用php编写socket程序时,也需要注意主机字节序和网络字节序的转换主机字节序就是我们平常说的大端和小端模式:不同的 CPU 有不同的字节序类型,这些字节序是指整数在内存中保存的顺...
php 16进制大端转小端,字节存储排序:大端和小端的判别及转换
weixin_33258222的博客
03-23
798
当前的存储器,多以byte为访问的最小单元,当一个逻辑上的地址必须分割为物理上的若干单元时就存在了先放谁后放谁的问题,于是端(endian)的问题应运而生了,对于不同的存储方法,就有大端(big-endian)和小端(little- endian)两个描述。字节排序按分为大端和小端,概念如下大端(big endian):低地址存放高有效字节,即网络字节序。小端(little endian):低字节...
php 字节序,Linux_Linux中网络字节序和主机字节序,主机字节序就是我们平常说的 - phpStudy...
weixin_42505792的博客
03-10
30
Linux中网络字节序和主机字节序主机字节序就是我们平常说的大端和小端模式:不同的 CPU 有不同的字节序类型,这些字节序是指整数在内存中保存的顺序 这个叫做主机序。Big-Endian和Little-Endian。引用标准的Big-Endian和Little-Endian的定义如下:a) Little-Endian就是低位字节排放在内存的低地址端,高位字节排放在内存的高地址端。b) Big-En...
主机字节序和网络字节序
qq_44875284的博客
05-10
1894
字节序
主机字节序与网络字节序
hou09tian的博客
09-18
3835
1 主机字节序
主机字节序(host-byte)指的是处理器存储数据的字节顺序。对于Inter x86处理器来说,将数据的不重要的部分保存在低地址,重要的部分保存在高地址,即低地址中保存的是数据的低字节位,高地址保存的是数据的高字节位。
int ip_Address_hostbyte = 0x12345678;
此时,Inter x86处理器按照如图1的格式来保存变量ip_Address_...
网络字节序和主机字节序
Vincent的专栏
01-11
860
现代CPU的累加器一次至少能装载4字节的数据。一个int类型占据4个字节(假设在32位系统上),那么这4字节在内存中排列的顺序将影响到它被累加器装载成的整数的值。这既是字节序的问题。字节序分为大端字节序和小端字节序。
假设有int a = 0x11223344
大端序:
整数高位字节在低地址内存,整数低位字节在高位地址。
小端序:
整数高位字节在高地址内存,整数低位字节在低位地址。
一般来说,...
htons函数详解
wenwen_2008的专栏
06-01
1874
Part 1: htons函数具体解释
在Linux和Windows网络编程时需要用到htons和htonl函数,用来将主机字节顺序转换为网络字节顺序。
在Intel机器下,执行以下程序
int main()
...{
printf("%d /n",htons(16));
return 0;
得到的结果是4096,初一看感觉很怪。
[python&php 网络编程]字节序转换
YIP
11-19
2042
如果不清楚关于字节序方面的知识,可以百度下
1.python写法
import socket
def convert_integer():
data = 1234
# 32-bit
print "Original: %s => Long host byte order: %s, Network byte order: %s" %(data, socket.ntohl
PHP的ntohl网络字节序函数及相关知识
weixin_34217711的博客
04-13
142
PHP与C服务器的socket通信,在做数据转换的时候,PHP没有提供对应将网络字节序和机器字节序相互转换的程序,但是根据函数的意义,我们可以做相应的转换来实现这一函数:
function ntohl($str){
$arr = unpack('I', pack('N', $str));
return $arr[1];
函数的意义 程序的作...
php转网络字节序,PHP的ntohl网络字节序函数及相关知识
weixin_39872191的博客
03-18
53
PHP与C服务器的socket通信,在做数据转换的时候,PHP没有提供对应将网络字节序和机器字节序相互转换的程序,但是根据函数的意义,我们可以做相应的转换来实现这一函数:function ntohl($str){$arr = unpack(‘I‘, pack(‘N‘, $str));return $arr[1];}函数的意义程序的作用是将网络字节序和机器字节序进行相互转换。在C/C++、Pytho...
IP的网络字节序
学而不思则罔
05-21
1952
1、c里面的inet_addr返回的是网络字节序
2、mysql的inet_aton返回的是主机字节序,其手册上说是网络字节序是不对的
3、php的long2ip接收的参数是无符号的主机字节序
4、php中没有提供网络字节序和主机字节序之间的转换,可以用以下代码将网络字节序地址转成点分十进制格式
// 192.168.5.242的网络字节序
$pi = 4060457152;// 注意
1-网络字节序和ip地址
网络安全
06-12
3388
1. 字节序
  之前我们在学习内存的时候可知,内存存储数据也是有大端存储和小端存储的,对于网络数据流同样有大端小端之分,那么为什么要定义网络字节序呢?
  原因是让不同cpu架构的计算机进行网络通信时,字节序不会混淆,因此tcp/ip协议规定了在网络中传输的字节流数据采用大端字节序。
图1-大端字节序
  通常,发送主机通常将发送缓冲区中的数据按内存地址从低到高的顺序发出,接收主机把...
socket网络字节序以及大端序小端序
芝麻软件工作室的专栏
06-02
4838
不同CPU中,4字节整数1在内存空间的存储方式是不同的。4字节整数1可用2进制表示如下:
00000000 00000000 00000000 00000001
有些CPU以上面的顺序存储到内存,另外一些CPU则以倒序存储,如下所示:
00000001 00000000 00000000 00000000
若不考虑这些就收发数据会发生问题,因为保存顺序的不同意味着对接收数据的解析顺
“相关推荐”对你有帮助么?
非常没帮助
没帮助
一般
有帮助
非常有帮助
提交
©️2022 CSDN
皮肤主题:大白
设计师:CSDN官方博客
返回首页
sole_cc
CSDN认证博客专家
CSDN认证企业博客
码龄10年
暂无认证
108
原创
10万+
周排名
169万+
总排名
58万+
访问
等级
6479
积分
55
粉丝
103
获赞
22
评论
350
收藏
私信
关注
热门文章
linux lightdm gdm gnome kde等的区别于联系(桌面环境 窗口管理器 显示管理器)
35526
nginx最大并发连接数的思考:worker_processes、worker_connections、worker_rlimit_nofile
26902
ubuntu如何关闭图形界面,启动文本模式
20792
Hadoop,Hbase启动及用web查看hadoop运行状态
18867
X86_64上没有写C函数声明导致的BUG(warning: initialization makes pointer from integer without a cast)
18786
分类专栏
算法new
架构设计
面试
性能优化
编解码
基金
linux
34篇
git
CMake
1篇
c++new
5篇
python
protobuf
epoll
2篇
tcp
1篇
vim
1篇
gdb
clion
1篇
搜索
电脑硬件
2篇
网络
最新评论
HTTP协议(rfc2626)中文翻译(修订版)
Ts势:
http 1.1 是 rfc 2616 名字都搞错了 RFC 2626 The Internet and the Millennium Problem (Year 2000)
linux 软件管理方式
我爱人工智能:
写的好,很nice,期待大佬回访!
linux 软件管理方式
洛阳泰山:
666,反手就是一个赞,欢迎回赞哦~
nginx最大并发连接数的思考:worker_processes、worker_connections、worker_rlimit_nofile
Tisfy:
十分完美,正如:长风破浪会有时,直挂云帆济沧海。
二叉树遍历之非递归算法
硬着头皮写代码的菜鸡:
tql
您愿意向朋友推荐“博客详情页”吗?
强烈不推荐
不推荐
一般般
推荐
强烈推荐
提交
最新文章
浅谈多态基类析构函数声明为虚函数
C++ 对象的内存布局(下)
C++ 对象的内存布局(上)
2019年7篇
2018年10篇
2016年44篇
2015年207篇
2014年158篇
目录
目录
分类专栏
算法new
架构设计
面试
性能优化
编解码
基金
linux
34篇
git
CMake
1篇
c++new
5篇
python
protobuf
epoll
2篇
tcp
1篇
vim
1篇
gdb
clion
1篇
搜索
电脑硬件
2篇
网络
目录
评论
被折叠的 条评论
为什么被折叠?
到【灌水乐园】发言
查看更多评论
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额
抵扣说明:
1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。 2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。
余额充值