pack() in php. Illegal hex digit warning
Asked Answered
S

7

11

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

Score answered 19/1, 2011 at 7:18 Comment(2)
Post more code. The str_replace() on $alert_device makes me think that there is more code in the middle that could be modifying the contents of $alert_device. With the code as posted, you shouldn't get the error that you are getting.Nebo
In my case, I received this error when I was trying to pass an empty value (or a slash /) to the pack() function. I found out what was causing the empty value and fixed that.Novelist
R
8

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.

Relief answered 19/1, 2011 at 7:38 Comment(0)
M
6

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

Maharani answered 10/7, 2015 at 7:51 Comment(0)
A
3

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.

Agogue answered 3/4, 2017 at 10:57 Comment(1)
Thanks! If you want APN-token instead of FCM-token for iOS don't includeGoogleService-Info.plist in the root directory, That was my mistake.Misstate
H
2

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

Hajji answered 22/1, 2017 at 18:46 Comment(0)
C
1

In this case, $alert_device is an array.

For packing it needs a value.

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

Conductive answered 24/10, 2013 at 12:54 Comment(0)
E
1

You must change

pack('H*', $someString)

To

strtr(rtrim(base64_encode(pack('H*', sprintf('%u', CRC32($someString))))
Excelsior answered 6/10, 2014 at 10:45 Comment(1)
Please can you add some explaining ?Eos
E
-3

Try to save your file in utf-8 encoding.

Ectosarc answered 8/10, 2012 at 6:38 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.