在7位PDU中解析'@'字符

编程语言 2026-07-09

大家下午好。我在写一个短信(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@&;?!-/:;”。这证实了网页使用“@”来表示一个零字节。

站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。

相关文章