Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/250.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Can';t串联x代码(\x)-PHP_Php - Fatal编程技术网

Can';t串联x代码(\x)-PHP

Can';t串联x代码(\x)-PHP,php,Php,我希望使用unpack() 这项工作: $srbytes = "\x80\x3e\x00\x00"; $array1 = unpack("v",$srbytes); 这并不是: $num1 = "80" $srbytes = "\x".$num1."\x3e\x00\x00"; $array1 = unpack("v",$srbytes); 或 使用echo打印此文件时,第一个完整字符串将显示ASCII字符,但连接的字符串将显示文本,直到它经过连接的位置为止 将完整字符串与串联字符串

我希望使用unpack()

这项工作:

$srbytes = "\x80\x3e\x00\x00";

$array1 = unpack("v",$srbytes); 
这并不是:

$num1 = "80"

$srbytes = "\x".$num1."\x3e\x00\x00";

$array1 = unpack("v",$srbytes);

使用echo打印此文件时,第一个完整字符串将显示ASCII字符,但连接的字符串将显示文本,直到它经过连接的位置为止

将完整字符串与串联字符串进行比较会显示false,即使它们应该相同


当我试图连接字符扩展时,实际发生的情况将不起作用,因为在执行
“\x”时。“80”
PHP已经有两个字符串文本。除了这一点,我们不可能想到这意味着什么

与其尝试连接十六进制值进行扩展,只需连接实际字符,方法是将十六进制值转换为base10整数,并将其传递给,后者将其转换为实际字节

$str = "";
$num1 = "80";
$str .= chr(base_convert($num1, 16, 10));
var_dump($str);
给你

string(1) "�" 字符串(1)”�"
当您在示例中将
$srbytes
的值定义为字符串文字
“\x80\x3e\x00\x00”
时,得到的是
var\u dump(“\x80\x3e\x00\x00”)
给您
字符串(4)”�>“
,因为PHP需要将转义的十六进制值扩展为字节。但是,
var\u dump(“\x”“80\x3e\x00\x00”)
只提供
字符串(7)”\x80>“
,这是因为值
“\x”
本身就是一个文本
”\x“
作为字符串。所以它们不是相同的值,不。

如果需要“文字”字符串,请使用单引号。您的问题是正在计算双引号内的转义字符序列。例如:

$srbytes = '\x'.'80\x3e\x00\x00'; 
echo $srbytes;
// \x80\x3e\x00\x00
var_dump($srbytes);
// string(16) "\x80\x3e\x00\x00" 

$srbytes = "\x"."80\x3e\x00\x00"; 
echo $srbytes;
// \x80>
var_dump($srbytes);
//string(7) "\x80>"

是的,
echo
不会显示空字节
echo
对于调试任何输出来说都是一个非常糟糕的工具。依赖
var\u dump()
要好得多,因为它至少为输出提供了可打印且有意义的表示,而
echo
/
print
/
print\r
根本无法实现。例如字符串的长度,告诉值何时为
false
null
,等等……结果肯定不一样<代码>字符串(7)“\x80>”向您提供的信息是
echo
并非如此。当它告诉您的全部信息是
\x80>
时,您可能会认为字符串仅由5个字符组成。显然不是这样。好的,我明白了。除了我选择如何调试字符串之外,你会说我的答案不正确吗?不是说它不正确,不是。这更像是一个汇总注释。不要使用
echo
调试变量。这就是为什么。例如,
var_dump()
将为您提供更多有用的信息,说明为什么这两个字符串在比较中不相等,因为您会看到一个字符串比另一个字符串长,并且肯定不会提供您所期望的。您完全正确。这些额外的信息会有很大的帮助。这非常有效。很好的解释,我有很多学习要做。
$srbytes = '\x'.'80\x3e\x00\x00'; 
echo $srbytes;
// \x80\x3e\x00\x00
var_dump($srbytes);
// string(16) "\x80\x3e\x00\x00" 

$srbytes = "\x"."80\x3e\x00\x00"; 
echo $srbytes;
// \x80>
var_dump($srbytes);
//string(7) "\x80>"