搜索
首页php教程PHP源码Socket通信中2进制数据读写类,PHP模仿java的DataInputStream和DataOutputStream

跳至

/**  pack 的format
 * 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)
 * q    signed long long (always 64 bit, machine byte order)
 * Q    unsigned long long (always 64 bit, machine byte order)
 * J    unsigned long long (always 64 bit, big endian byte order)
 * P    unsigned long long (always 64 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
 */

                       

           

2. [代码]使用例子-1     跳至

$out = new OutputStream();

$out->writeNumber(100);
$out->writeShort(20);
$out->writeStr("i love wanes",25);
$out->writeChar("48");
$msg = $out->getOutStream();

echo $msg,"\n","长度:",$out->getLen(),"\n";
//*每个数据包的长度一般都是固定的

$in = new InputStream($msg);

echo $in->readNumber(0)," \n ";
echo $in->readShort(0+4)," \n ";
echo $in->readStr(4+2,25)," \n ";
echo $in->readChar(4+2+25)," \n ";

           

           

           

3. [代码]使用例子-2 swoole_client中发送/解析2进制    

/**
 * Created by PhpStorm.
 * User: wanwan
 * Date: 16/4/6
 * Time: 上午9:02
 */
$serv = new swoole_server("127.0.0.1", 7890);
$serv->set(array(
    'worker_num' => 1,   //工作进程数量
    'daemonize' => false, //是否作为守护进程
));
$serv->on('connect', function ($serv, $fd) {
    echo "Client: $fd Connect.\n";
});
$serv->on('receive', function ($serv, $fd, $from_id, $data) {
    file_put_contents(__DIR__ . "/test.txt", $data . "\n", FILE_APPEND);
    $in = new InputStream($data);
    echo "长度   : ", $in->readNumber(0), " \n";
    echo "指令   : ", $in->readNumber(4), " \n";
    echo "流水号 : ", $in->readNumber(8), " \n";
    echo "企业号 : ", $in->readStr(12, 6), " \n";
    //echo "密钥串 : ",$in->readStr(18,16)," \n";
    echo "版本号 : ", $in->readChar(18 + 16), " \n";
    echo "时间戳 : ", $in->readNumber(18 + 16 + 1), " \n";

    $out = new OutputStream();
    $out->writeNumber(100);
    $out->writeShort(20);
    $out->writeStr("i love wanes",25);
    $out->writeChar("48");
    $msg = $out->getOutStream();
    echo $msg,"长度 :",$out->getLen(),"\n";
    $serv->send($fd, $msg);
    $serv->close($fd);
});
$serv->on('close', function ($serv, $fd) {
    echo "Client: $fd Close.\n";
});
$serv->start();

           

           

                   

4. [文件] InputStram.php ~ 2KB  

               

stream = $stream_str;
    }

    /**
     * 私有方法:截取流字符串
     * @param $star 开始位置
     * @param $len  截取长度
     * @return string 返回截取好对应字段的流字符串
     */
    private function read($star, $len)
    {
        return substr($this->stream, $star, $len);
    }

    /**
     * @inheritdoc 读取一个32位的数字,注:php中int和java的long/short是对等的
     * @param $star 开始位置
     * @param int $len 长度,默认是int
     * @param bool $sign 是否是signed类型,默认不是
     * @return mixed 返回一个number
     */
    public function readNumber($star, $len = 4, $sign = false)
    {
        $temp = unpack($sign ? "l" : "N", $this->read($star, $len));
        return $temp[1];
    }

    /**
     * @inheritdoc 读取定长字符串
     * @param $star 开始位置
     * @param int $len 长度
     * @param bool $sign 是否是signed类型,默认不是
     * @return mixed 返回一个字符串
     */
    public function readStr($star, $len, $sign = false)
    {
        $format = $sign ? "a" : "A";
        $temp = unpack($format . $len, $this->read($star, $len));
        return $temp[1];
    }

    /**
     * @inheritdoc 读取短数字
     * @param $star 开始位置
     * @param bool $sign 是否是signed类型,默认不是
     * @return mixed 返回一个short
     */
    public function readShort($star, $sign = false)
    {
        $temp = unpack($sign ? "s" : "n", $this->read($star, 2));
        return $temp[1];
    }

    /**
     * @inheritdoc 读一个字洁/字符 = java.readByte
     * @param $star 开始位置
     * @param bool $sign 是否是signed类型,默认不是
     * @return mixed 返回一个char
     */
    public function readChar($star, $sign = false)
    {
        $temp = unpack($sign ? "c" : "C", $this->read($star, 1));
        return $temp[1];
    }


    /**
     * @inheritdoc 读一个字节型字符串 = java.readBytes
     * @param $star 开始位置
     * @param int $len 长度,默认是1
     * @param bool $sign 是否是signed类型,默认不是
     * @return mixed 返回一个number
     */
    public function readChars($star,$len = 1,$sign = false)
    {
        $temp = unpack($sign ? "c$len" : "C$len", $this->read($star, $len));
        return $temp[1];
    }

}

                           

           

                   

5. [文件] OutputStream.php ~ 2KB    

stream .= pack($format, $number);
            $this->len+=$len;
        }else{
            $this->stream .= pack($sign?"l":"N", $number);
            $this->len+=4;
        }
    }

    /**
     * @inheritdoc 写入一个byte
     * @param $char
     * @param bool $sign 是否signed类型数据
     * @inheritdoc 这默认是8位/1字节的char = java.writeByte
     */
    public function writeChar($char,$sign = false)
    {
        $this->stream .= pack($sign?"c":"C", $char);
        $this->len+=1;
    }
    /**
     * @inheritdoc 字符串以byte的形式写入流 = java.writeBytes
     * @param $str
     * @param int $len 字符串长度
     * @param bool $sign 是否signed类型数据
     */
    public function writeChars($str,$len = 1,$sign = false)
    {
        $this->stream .= pack($sign?"c$len":"C$len", $str);
        $this->len+=1;
    }

    /**
     * @inheritdoc 写定长字符串
     * @param $str
     * @param $len 字符串长度
     * @param bool $sign 是否signed类型数据
     */
    public function writeStr($str, $len,$sign = false)
    {   $format =$sign? "a" : "A" ;
        $this->stream .= pack($format.$len, $str);
        $this->len+=$len;
    }

    /**
     * @inheritdoc 这默认是16位/2字节的short
     * @param $short short数据
     * @param bool $sign 是否是signed类型,默认不是
     */
    public function writeShort($short,$sign = false)
    {
        $this->stream .= pack($sign?"s":"n", $short);
        $this->len+=2;
    }

    /**
     * @return string 返回2进制流
     */
    public function getOutStream()
    {
        return $this->stream;
    }

    /**
     * @return int获取流字节长度
     */
    public function getLen(){
        return $this->len;
    }
}

                           

       

声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

AI Hentai Generator

AI Hentai Generator

免费生成ai无尽的。

热门文章

R.E.P.O.能量晶体解释及其做什么(黄色晶体)
3 周前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳图形设置
3 周前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您听不到任何人,如何修复音频
3 周前By尊渡假赌尊渡假赌尊渡假赌

热工具

SublimeText3 英文版

SublimeText3 英文版

推荐:为Win版本,支持代码提示!

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

Atom编辑器mac版下载

Atom编辑器mac版下载

最流行的的开源编辑器

MinGW - 适用于 Windows 的极简 GNU

MinGW - 适用于 Windows 的极简 GNU

这个项目正在迁移到osdn.net/projects/mingw的过程中,你可以继续在那里关注我们。MinGW:GNU编译器集合(GCC)的本地Windows移植版本,可自由分发的导入库和用于构建本地Windows应用程序的头文件;包括对MSVC运行时的扩展,以支持C99功能。MinGW的所有软件都可以在64位Windows平台上运行。

Dreamweaver Mac版

Dreamweaver Mac版

视觉化网页开发工具