10

我在 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

非法的十六进制数字一直在变化。有关此警告的任何想法以及删除它的方法。

检查它住在这里

4

7 回答 7

8

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

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

产生!3,因为!代码为 0x21 且3代码为 0x33。由于g不是十六进制数字,因此会给出警告。为了对包的H格式有用,参数必须是十六进制数。如果$alert_device不是 - 您应该使用其他东西,具体取决于它是什么以及您期望的结果。

于 2011-01-19T07:38:17.167 回答
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

于 2015-07-10T07:51:09.190 回答
3

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

于 2017-04-03T10:57:13.333 回答
2

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

于 2017-01-22T18:46:53.007 回答
1

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

对于包装,它需要一个值。

改为使用 pack('H*', str_replace(' ', '', $alert_device[0]))

于 2013-10-24T12:54:01.167 回答
1

你必须改变

pack('H*', $someString)

strtr(rtrim(base64_encode(pack('H*', sprintf('%u', CRC32($someString))))
于 2014-10-06T10:45:11.230 回答
-3

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

于 2012-10-08T06:38:39.697 回答