PHP如何从整数生成有效的十六进制转义序列

时间:2014-02-01 08:48:41

标签: php hex


总之,我有一个数字,例如$ n = 90 我需要将此数字设为HEX字符,对于$ n = 90,字符串将为“\ x5a”。 到目前为止,我已经尝试过:

$n = 30;
$h = dechex($n);
$s = "\x" . $h;

但它没有被PHP正确转义-__-

重点是我正在尝试向网络ESC / POS打印机发送命令,完整代码为:

public function lineSpacing($n = 30) {
    $h = dechex($n);
    $this->buff("\x1b\x33\x" . $h);
}

非常感谢任何帮助^ __ ^

3 个答案:

答案 0 :(得分:2)

好的,所以我仍然无法找到如何正确构建\ xHH但

public function lineSpacing($n = 30) {
    $c = chr($n);
    $this->buff("\x1b\x33" . $c);
}

为我工作。

答案 1 :(得分:1)

问题是你的字符串上的PHP解释“\ x”有文字字符,而不是转义序列......

过去6个小时我一直处理同样的问题,你的问题让我意识到了真正的问题。

假设您有一个填充了转义序列的字符串(十六进制):

$epsonCmd_OK = "\x1B\x21\x08";

上面的字符串不一样($ final):

$epsonCmd_NOTOK = "\x1b\x21\x";
$hex = "08";
$final = $epsonCmd_NOTOK . $hex;

为什么?

我们来看看!
第一个字符串 $ epsonCmd_OK 有3个字符,十六进制的 \ x1B \ x21 和的 \ X08 即可。 (都有逃脱序列)

第二个字符串 $ epsonCmd_NOTOK 有4个字符,十六进制的 \ x1B \ x21 加上文字字符“\”和“x” ”

因为“\ x”没有转义序列,PHP认为它有2个普通字符,没有转义序列的开头。然后当你将 $ hex 连接到字符串时,你只是在字符串中添加更多字符,因为PHP解释器已经确定“\ x”是字符,而不是转义序列的开始。

在这种特定情况下,最好的方法是使用 PHP chr()函数(只有@ leumas95说明):

$epsonCmd_NOTOK = "\x1b\x21"; // no "\x" needed here
$dec = 8;
$final = $epsonCmd_NOTOK . chr($dec); // now $final is equivalent to $epsonCmd_OK

答案 2 :(得分:0)

$n = 30;
$h = dechex($n);
$s = "\\x" . $h;

阅读escape sequences