php.ini 中的 pack()非法十六进制数字警告

发布于 2024-10-12 21:18:54 字数 872 浏览 8 评论 0原文

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

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

此处查看

i am having some problems using pack() in php

$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;
}

Now sometimes i get following warnings running the same code -

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

the illegal hex digit keeps varying though. Any ideas about this warning and ways to remove it.

check it live here

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(7

物价感观 2024-10-19 21:18:54

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

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

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

pack converts hexadecimal number to binary, e.g.:

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

produces !3, since ! has code 0x21 and 3 has code 0x33. Since g is not hex digit, warning is given. To be useful for pack's H format, the argument must be hex number. If $alert_device isn't - you should use something else, depending on what it is and what you expect as the result.

耶耶耶 2024-10-19 21:18:54

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

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

One of the reason for the error is related to the checksums,

Because PHP's integer type is signed many crc32 checksums will result
in negative integers on 32bit platforms. On 64bit installations all
crc32() results will be positive integers though. So you need to use
the "%u" formatter of sprintf() or printf() to get the string
representation of the unsigned crc32() checksum in decimal format.
http://www.php.net/crc32

To fix the error this might be sufficient,

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

In this case,

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

Ref: https://github.com/bearsunday/BEAR.Package/issues/136

秉烛思 2024-10-19 21:18:54

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

I was having the same issue when developing a hybrid app using Ionic/Cordova/PhoneGap. As the same code is run in Android and iOS devices, I had made a mistake of storing Google FCM token as APNS token. The APNS token is purely hexadecimal but Google FCM token can have non-hexadecimal characters. So, packing a Google FCM token using PHP's pack() function will result in the illegal hex digit error.

心意如水 2024-10-19 21:18:54

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

Use strtr(rtrim(base64_encode(pack('H*', sprintf('%u', $algo($data)))), '='), '+/', '-_') insted of using pack('H*', $value).

感受沵的脚步 2024-10-19 21:18:54

在本例中,$alert_device 是一个数组。

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

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

In this case, $alert_device is an array.

For packing it needs a value.

Use
pack('H*', str_replace(' ', '', $alert_device[0])) instead.

∝单色的世界 2024-10-19 21:18:54

您必须更改

pack('H*', $someString)

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

You must change

pack('H*', $someString)

To

strtr(rtrim(base64_encode(pack('H*', sprintf('%u', CRC32($someString))))
苏大泽ㄣ 2024-10-19 21:18:54

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

Try to save your file in utf-8 encoding.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文