【问题标题】:pack() in php. Illegal hex digit warning打包()在 php.ini 中。非法十六进制数字警告
【发布时间】:2011-06-11 14:04:41
【问题描述】:

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

【问题讨论】:

  • 发布更多代码。 $alert_device 上的 str_replace() 让我觉得中间有更多代码可以修改 $alert_device 的内容。使用发布的代码,您应该不会收到您遇到的错误。
  • @sander:查看已编辑的问题。
  • 就我而言,当我尝试将空值(或斜杠 /)传递给 pack() 函数时收到此错误。我找出了导致空值的原因并修复了它。

标签: php hex pack


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

      为了包装它需要一个值。

      使用 pack('H*', str_replace(' ', '', $alert_device[0])) 代替。

      【讨论】:

        【解决方案4】:

        你必须改变

        pack('H*', $someString)
        

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

        【讨论】:

        • 请你添加一些解释?
        【解决方案5】:

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

        因为 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

        【讨论】:

          【解决方案6】:

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

          【讨论】:

            【解决方案7】:

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

            【讨论】:

            • 谢谢!如果你想要 APN-token 而不是 FCM-token for iOS 不要在根目录中包含GoogleService-Info.plist,那是我的错误。
            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2014-09-25
            • 2012-12-04
            • 2019-12-26
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2015-02-14
            相关资源
            最近更新 更多