在PHP中打包()。非法十六进制数字警告

时间:2011-01-19 07:18:09

标签: php hex pack

我在php

中使用pack()时遇到了一些问题
$currencypair = "EUR/USD";
$buy_sell = "buy";
$alert_device_token =array("a","a","b");
$message = "Your " . $currencypair . " " . $buy_sell . " alert price has been reached!";
$payload['aps'] = array (
  'alert' => $message,
  'badge' => 1,
  'sound' => 'default'
);
$payload = json_encode($payload);

foreach ($alert_device_token as $alert_device)
{
  $apnsMessage = chr(0) . chr(0) . chr(32) . 
                 pack('H*', str_replace(' ', '', $alert_device)) . 
                 chr(0) . chr(strlen($payload)) . $payload;
  echo $apnsMessage;
}

现在有时我会听到运行相同代码的警告 -

Warning: pack() [function.pack]: Type H: illegal hex digit g in /code/FR2BVl

非法的十六进制数字虽然不断变化。关于此警告的任何想法以及删除它的方法。

现场查看here

7 个答案:

答案 0 :(得分:6)

pack将十六进制数转换为二进制数,例如:

  echo pack("H*", "2133")

生成!3,因为!代码为0x21,3代码为0x33。由于g不是十六进制数字,因此会给出警告。要对pack的H格式有用,参数必须是十六进制数。如果$alert_device不是 - 你应该使用别的东西,这取决于它是什么以及你期望的结果。

答案 1 :(得分:6)

错误的原因之一与校验和有关,

  

由于PHP的整数类型已签名,因此会产生许多crc32校验和   在32位平台上的负整数。全部64位安装   crc32()结果虽然是正整数。所以你需要使用   sprintf()或printf()的“%u”格式化程序来获取字符串   以十进制格式表示无符号crc32()校验和。   http://www.php.net/crc32

要修复错误,这可能就足够了,

sprintf('%u', CRC32($someString))

在这种情况下,

pack('H*', str_replace(' ', '', sprintf('%u', CRC32($alert_device))))

参考:https://github.com/bearsunday/BEAR.Package/issues/136

答案 2 :(得分:2)

使用strtr(rtrim(base64_encode(pack('H*', sprintf('%u', $algo($data)))), '='), '+/', '-_')使用pack('H*', $value)

答案 3 :(得分:2)

在使用Ionic / Cordova / PhoneGap开发混合应用时遇到了同样的问题。由于在Android和iOS设备上运行相同的代码,因此我错误地将Google FCM令牌存储为APNS令牌。 APNS令牌纯粹是十六进制的,但Google FCM令牌可以包含非十六进制字符。因此,使用PHP的pack()函数打包Google FCM令牌会导致illegal hex digit错误。

答案 4 :(得分:1)

在这种情况下,$alert_device是一个数组。

包装需要一个价值。

使用 而是pack('H*', str_replace(' ', '', $alert_device[0]))

答案 5 :(得分:1)

你必须改变

pack('H*', $someString)

strtr(rtrim(base64_encode(pack('H*', sprintf('%u', CRC32($someString))))

答案 6 :(得分:-2)

尝试以utf-8编码保存文件。