我需要发送串联的SMS,我将其消息(超过160个字节)分成小部分,现在我想在每个部分中放置一个标头。标头有6个八位字节,如下所示

字段1(1个八位位组):用户数据标题的长度,在这种情况下为05。
字段2(1个八位字节):信息元素标识符,等于00(串联的短消息,8位参考号)
字段3(1个字节):标头的长度,不包括前两个字段;等于03
字段4(1个八位字节):00-FF,CSMS参考编号,对于CSMS中的所有SMS部件必须相同
栏位5(1个八位位组):00-FF,零件总数。
字段6(1个八位位组):00-FF,此部分为序列号。

例:
05 00 03 CC 02 01 [消息]
05 00 03 CC 02 02 [消息]

现在的问题是我想将这6个八位位组放入7个七位组中,并且需要将SMS消息的大小从160个字符减少到153个字符。如何将这6个八位组转换为7个九位组。

最佳答案

确实没有那么困难。

7位数字和8位数字之间的区别在于7位数字的高位缺失。

考虑到您直接处理字节,我将假设您直接在PDU模式下执行此操作,尤其是因为您似乎确实知道字节布局是什么。

要将8位字节转换为7位,您只需要去除高位EG:

如果你有

05 00 03 CC


然后在8位中

00000101 00000000 00000011 11001100


从技术上讲,将它们截断为7位,只需剥离最高位,如下所示

0000101 0000000 0000011 1001100


但是,您会遇到上述价值观的问题,那就是您的

CC


值。如果从中删除最高位,则可以有效地将其更改为

4C


这可能会导致您的SMS系统错误地解释详细信息

正是由于这个原因,在几乎所有情况下,当直接使用8位发送来处理二进制文件时,都可以保留这些值。

但是,如果您想尝试该示例,则下一步是将7位值连接在一起,如下所示

0000101000000000000111001100


然后,您需要将其除以8(即使编码不是,传输介质仍为8位)

00001010 00000000 00011100 1100


然后将最后一个字节填充为8位,以便传输为偶数

00001010 00000000 00011100 1100xxxx


xxxx将全为1或全为0,具体取决于您用来发送字节的方式,如果它是AT命令,那么请全为0,这样您的7位编码最终将变为

0A 00 1C C0


如您所见,它没有为您节省任何字节。

仅当您使用GSM字母(通过设置正确的DCS值获得)时,才可以可靠地使用7位编码。再次设置该方式取决于您最初使用哪种方式发送SMS。

例如,大多数HTTP提供程序都提供某种开关/标志来执行此操作。

10-08 19:46