敘事
今天被ASCII碼里的00 結結實實的擺了一道.
lua從GSM卡 AT+CSCA? 取到短信中心號碼, 因為是PDU模式, 所以我拿到的是這么個玩意兒:
+CSCA: "002B0038003600310033003000310030003100310032003500300030",145
正則提取出來傳給了php. 用php 的 chr(hexdec($str)) 組合就能轉成字符串, 打印看了一下:
+8613010112500
沒毛病,繼續, 存mysql ,存redis .
第一次中毒:
存儲的時候不想要前面的+加號, substr($str,1); 沒毛病哈. 結果, 任你百般折騰,代碼自巋然不動.
沒辦法 曲線救國 ,轉之前 把前面的002B 截取掉, 再轉, 可以了.
第二次中毒:
放redis里的時候沒毛病, 但是存儲mysql的時候, 因為字段長度給的就是13位. 結果只存儲了6位進去 . 又是一頓折騰. 怎么打印長度都是 26 ,而不是理所應當的是13 . 敵進我退敵疲我打, 我把數據庫的字段長度改成了26 . 進來了.
第三次中毒:
PDU模式發送中英文短信的時候, 要把 8613010112500 格式化成 683110102105F0
我用到了str_split ,有了前兩次的毒發 ,知道大概是怎么回事兒了 . 網上查了下, ASCII碼里的00 是空字符, 輸出不了.
于是了有了下面的測試:
$str = "0038003600310033003000310030003100310032003500300030"; $n = str_split($str,2); $r = ""; for($i=0;$i<count($n);$i++){ if($n[$i] != "00"){ $r .= chr(hexdec($n[$i])); } } echo "長度:".strlen($r)."\r\n"; echo "內容:".$r; echo "\r\n\r\n"; $o = chr(hexdec("00000000")) . chr(hexdec("00000000")) . chr(hexdec("00000000")) . chr(hexdec("00000000")); echo "長度:".strlen($o); echo "\r\n內容:--->>".$o."<<---\r\n";
打印如下:
代碼都不難, 吃一塹長一智啊.
btw, 這要是往誰的代碼里加上這么一串兒, [壞笑]