敘事
今天被ASCII碼里的00 結(jié)結(jié)實(shí)實(shí)的擺了一道.
lua從GSM卡 AT+CSCA? 取到短信中心號(hào)碼, 因?yàn)槭荘DU模式, 所以我拿到的是這么個(gè)玩意兒:
+CSCA: "002B0038003600310033003000310030003100310032003500300030",145
正則提取出來(lái)傳給了php. 用php 的 chr(hexdec($str)) 組合就能轉(zhuǎn)成字符串, 打印看了一下:
+8613010112500
沒(méi)毛病,繼續(xù), 存mysql ,存redis .
第一次中毒:
存儲(chǔ)的時(shí)候不想要前面的+加號(hào), substr($str,1); 沒(méi)毛病哈. 結(jié)果, 任你百般折騰,代碼自巋然不動(dòng).
沒(méi)辦法 曲線救國(guó) ,轉(zhuǎn)之前 把前面的002B 截取掉, 再轉(zhuǎn), 可以了.
第二次中毒:
放redis里的時(shí)候沒(méi)毛病, 但是存儲(chǔ)mysql的時(shí)候, 因?yàn)樽侄伍L(zhǎng)度給的就是13位. 結(jié)果只存儲(chǔ)了6位進(jìn)去 . 又是一頓折騰. 怎么打印長(zhǎng)度都是 26 ,而不是理所應(yīng)當(dāng)?shù)氖?3 . 敵進(jìn)我退敵疲我打, 我把數(shù)據(jù)庫(kù)的字段長(zhǎng)度改成了26 . 進(jìn)來(lái)了.
第三次中毒:
PDU模式發(fā)送中英文短信的時(shí)候, 要把 8613010112500 格式化成 683110102105F0
我用到了str_split ,有了前兩次的毒發(fā) ,知道大概是怎么回事兒了 . 網(wǎng)上查了下, ASCII碼里的00 是空字符, 輸出不了.
于是了有了下面的測(cè)試:
$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 "長(zhǎng)度:".strlen($r)."\r\n"; echo "內(nèi)容:".$r; echo "\r\n\r\n"; $o = chr(hexdec("00000000")) . chr(hexdec("00000000")) . chr(hexdec("00000000")) . chr(hexdec("00000000")); echo "長(zhǎng)度:".strlen($o); echo "\r\n內(nèi)容:--->>".$o."<<---\r\n";
打印如下:
代碼都不難, 吃一塹長(zhǎng)一智啊.
btw, 這要是往誰(shuí)的代碼里加上這么一串兒, [壞笑]