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
사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover
사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool
무료로 이미지를 벗다

Clothoff.io
AI 옷 제거제

AI Hentai Generator
AI Hentai를 무료로 생성하십시오.

인기 기사
R.E.P.O. 에너지 결정과 그들이하는 일 (노란색 크리스탈)
3 몇 주 전
By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. 최고의 그래픽 설정
3 몇 주 전
By 尊渡假赌尊渡假赌尊渡假赌
어 ass 신 크리드 그림자 : 조개 수수께끼 솔루션
1 몇 주 전
By DDD
R.E.P.O. 아무도들을 수없는 경우 오디오를 수정하는 방법
3 몇 주 전
By 尊渡假赌尊渡假赌尊渡假赌
Atomfall에서 크레인 제어 키 카드를 찾을 수 있습니다
1 몇 주 전
By DDD

뜨거운 도구

메모장++7.3.1
사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전
중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기
강력한 PHP 통합 개발 환경

드림위버 CS6
시각적 웹 개발 도구

SublimeText3 Mac 버전
신 수준의 코드 편집 소프트웨어(SublimeText3)

뜨거운 주제
Gmail 이메일의 로그인 입구는 어디에 있나요?
7422
15


Cakephp 튜토리얼
1359
52


Steam의 계정 이름 형식은 무엇입니까?
76
11


Win11 활성화 키 영구
27
19

