2011-01-19 20 views
7

tôi đang gặp một số vấn đề sử dụng gói() trong phpgói() bằng php. Bất hợp pháp cảnh báo hex chữ số

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

Bây giờ cảnh báo đôi khi tôi nhận được sau chạy cùng mã -

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

hex chữ số bất hợp pháp vẫn tiếp tục thay đổi mặc dù. Bất kỳ ý tưởng nào về cảnh báo này và các cách để loại bỏ nó.

kiểm tra xem nó sống here

+0

Đăng thêm mã. 'Str_replace()' trên '$ alert_device' làm cho tôi nghĩ rằng có nhiều mã ở giữa có thể sửa đổi nội dung của' $ alert_device'. Với mã như được đăng, bạn không nên nhận được lỗi mà bạn đang nhận được. –

+0

@sander: xem câu hỏi đã chỉnh sửa. – ayush

+0

Trong trường hợp của tôi, tôi nhận được lỗi này khi tôi đang cố chuyển một giá trị rỗng (hoặc dấu gạch chéo /) vào hàm pack(). Tôi phát hiện ra điều gì đã gây ra giá trị rỗng và sửa nó. – Volomike

Trả lời

6

pack chuyển đổi số thập lục phân sang nhị phân, ví dụ .:

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

sản xuất !3, kể từ khi có mã ! 0x21 và 3 có mã 0x33. Vì g không phải là chữ số hex, cảnh báo được đưa ra. Để hữu ích cho định dạng H của gói, đối số phải là số hex. Nếu $alert_device không phải là - bạn nên sử dụng cái gì khác, tùy thuộc vào nó là gì và những gì bạn mong đợi như là kết quả.

-2

Hãy thử lưu tệp của bạn bằng mã hóa utf-8.

0

Trong trường hợp này, $alert_device là một mảng.

Để đóng gói, cần có giá trị.

Sử dụng pack('H*', str_replace(' ', '', $alert_device[0])) để thay thế.

1

Bạn phải thay đổi

pack('H*', $someString) 

Để

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

Bạn có thể thêm một số giải thích không? – Zulu

6

Một trong những lý do cho các lỗi có liên quan đến tổng kiểm tra,

Bởi vì loại nguyên của PHP được ký kết nhiều checksums crc32 sẽ cho kết quả trong số nguyên âm trên nền tảng 32 bit. Trên các cài đặt 64bit, tất cả các kết quả crc32() sẽ là các số nguyên dương. Vì vậy, bạn cần phải sử dụng trình định dạng "% u" của sprintf() hoặc printf() để nhận được chuỗi trình bày về kiểm tra crc32() chưa kiểm tra ở định dạng thập phân. http://www.php.net/crc32

Để khắc phục lỗi này có thể là đủ,

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

Trong trường hợp này,

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

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

2

Sử dụng strtr(rtrim(base64_encode(pack('H*', sprintf('%u', $algo($data)))), '='), '+/', '-_') insted của việc sử dụng pack('H*', $value).

0

Tôi gặp sự cố tương tự khi phát triển ứng dụng lai sử dụng Ionic/Cordova/PhoneGap. Khi cade tương tự được chạy trong các thiết bị Android và iOS, tôi đã nhầm lẫn khi lưu trữ mã thông báo FCM của Google dưới dạng mã thông báo APNS.Mã thông báo APNS hoàn toàn là hệ thập lục phân nhưng mã thông báo FCM của Google có thể có các ký tự không phải hệ thập lục phân. Vì vậy, việc đóng gói mã thông báo FCM của Google bằng chức năng pack() của PHP sẽ dẫn đến lỗi illegal hex digit.

Các vấn đề liên quan