1

我需要与套接字的 TCP/IP 进行通信并打包一条消息,但我在打包空字符时遇到了问题。

在文档中我有这个:

PMS 必须在所有 char 变量的末尾添加 NULL char。因此,上面的 char [20] 声明(或 char [0..19] 的等效 Delphi 声明)实际上意味着 19 个可用字符加上 1 个空格用于 NULL。

这是我的 php 代码:

$message = pack('N', 1431655765)                      //HEADER - uint32 ui32Synch1
    . pack('N', 2863311530)                           //HEADER - uint32 ui32Synch1
    . pack('v', 1)                                    //HEADER - uint16 ui16Version
    . pack('V', 1)                                    //HEADER - uint32 ui32Cmd;
    . pack('V', 44)                                   //HEADER - uint32 ui32BodySize
    . pack('a20', "44436412")                         //BODY - char szLisence[20]
    . pack('a20', "Test_Program")                     //BODY - char szApplName[20]
    . pack('I', 0);                                   //BODY - int  nRet

    echo "<br/> Message - packed = " . $message . "<br/> strlen " . strlen($message);

    echo "<br/> Hex dump PHP = " . bin2hex($message);

输出:

消息 - 打包 = UUUUªªªª,44436412Test_Program

斯特伦 62

十六进制转储 PHP = 55555555aaaaaaaa0100010000002c000000343434333634313200000000000000000000000000000000000000546573745f50726f6772616d00000000000000000000000

C++:

我正在将一个 c++ 应用程序重写为 PHP,我有一个 hexdump 的消息需要发送到 c++ hexdump c++​​ 中的服务器: 55555555aaaaaaaa0100010000002c000000343434333634313200cdcdcdcdcdcdcdcdcdcdcd546573745f50726cdcdcdcdf677261000000cdcd

比较 hexdump 直到 pack('V', 44):

  • PHP: 5555555aaaaaaaa0100010000002c000000
  • C++: *55555555aaaaaaaa0100010000002c000000

比较 hexdumps 直到 pack('a20', "44436412"):

  • PHP: 55555555aaaaaaaa0100010000002c000000343434333634313200000000000000000000000
  • C++:55555555aaaaaaaa0100010000002c000000343434333634313200cdcdcdcdcdcdcdcdcdcdcd

就像我们可以看到我在文档中询问的那样添加的 pack null char,在 php 中与在 c++ 中不同。

我需要做什么才能给相同的包 null char?

4

2 回答 2

0

在测试了同一 c++ 应用程序的最新版本后,我检查了 wireshark 发送到服务器的消息在 null char 时没有“cdcdcdcd ...”,已经像 PHP 一样有“00000000”,所以我唯一需要做的就是是这样打包的:

pack('a20', "44436412");
于 2013-09-29T20:14:00.767 回答
0

在php中打包一个空字符,只需将空字符用“C”打包即可。这是代码,

<?php
    $value = pack("C", null);
    echo $value;
    echo ord($value);
?>

可以运行一个在线的php运行环境,得到这个img这样的答案,

在此处输入图像描述

于 2016-07-26T00:47:49.860 回答