我在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
答案 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))))
答案 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编码保存文件。