在7位PDU中解析'@'字符
大家下午好。我在写一个短信(SMS)消息解析器。除了一个问题,一切工作正常。在某些情况下,'@' 字符被解析为0x00,而不是0x40。我尝试了若干代码示例,它们都返回相同的结果。然而,在线的PDU解析器能够正确组装数据包。下面是我正在使用的代码:
uint8_t uArr[] = {0xF0, 0x7B, 0x2F, 0x26, 0x9B, 0xD1, 0x6A, 0xB6, 0x78, 0x94, 0x05, 0x9F, 0xF7, 0x00, 0xA6, 0xDD, 0x2F, 0xD4, 0x7A, 0xE9, 0x76};
uint8_t uOut_Arr[0x19];
uint8_t i,b;
uint8_t length = 0x19;
b = 0;
for (i = 0; i < length; i++) {
int byte_idx = i * 7 / 8;
int bit_idx = i * 7 % 8;
uint16_t ch = uArr[byte_idx] >> bit_idx;
if (bit_idx > 0) {
ch |= (uint16_t)uArr[byte_idx + 1] << (8 - bit_idx);
}
uOut_Arr[b++] = (uint8_t)(ch & 0x7F);
}
printf(uOut_Arr);
我得到以下序列:
F0 7B 2F 26 9B D1 6A B6 78 94 05 9F F7 00 A6 DD 2F D4 7A E9 76
转换后,结果应该是pw=123456qQ,ps=@&;?!-/:;,然而在 '@' 的位置出现了一个空值。虽然如果你数数,'@' 位于数组字节的下标13。高位去哪儿了?为什么 https://www.smsdeliverer.com/online-sms-pdu-decoder.aspx 能正确解析这条消息?
P.s.完整消息是 07919781340310F1040B919751390289F700006250401160512118F07B2F269BD16AB67894059FF700A6DD2FD47AE976
p.p.s: 我虽然发送的是pw=123456qQ,ps=@&;?!-/:;,但在线解析器也能正确解析
解决方案
题中代码的解码输出是正确的;正确的输出应该是“w=123456qQ,ps=N&;?!-/:;”,其中 N 表示空字符,而不是“@”。
你所使用的网页在输出字符为零时会显示“@”。它很可能在这种情况下把“@”作为占位符,因为零字节不易打印。
可以通过拿你提供的消息数据,07919781340310F1040B919751390289F700006250405143512119F07B2F269BD16AB67894059FF76200D3EE176ABD743B,替换从那个“F0”起的14位数字为零,得到07919781340310F1040B919751390289F70000625040514351211900000000000000B67894059FF76200D3EE176ABD743B。当我们让你链接的网页对其解码时,它显示“@@@@@@@@6qQ,ps=1@&;?!-/:;”。这证实了网页使用“@”来表示一个零字节。