如何打包null char?

时间:2013-09-27 10:51:03

标签: php null char pack

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

在文档中我有这个:

  

PMS必须在所有char变量的末尾添加NULL char。因此,上面的char [20]声明(或等效的[0..19] char的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

strlen 62

Hex dump PHP = 55555555aaaaaaaa0100010000002c0000003434343336343132000000000000000000000000546573745f50726f6772616d000000000000000000000000

C ++:

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

比较hexdumps直到打包('V',44):

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

比较hexdumps直到打包('a20',“44436412”):

  • PHP:55555555aaaaaaaa0100010000002c000000343434333634313200000000000000000000000
  • C ++:55555555aaaaaaaa0100010000002c000000343434333634313200cdcdcdcdcdcdcdcdcdcdcdcd

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

我需要做些什么来为同一个包提供null char?

2 个答案:

答案 0 :(得分:0)

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

pack('a20', "44436412");

答案 1 :(得分:0)

在php中打包一个空字符,只需用&#34; C&#34;没关系这是代码,

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

您可以运行在线php运行环境,并获得类似img的答案,

enter image description here