我需要发送串联的短信,我将消息(超过 160 字节)分成小部分,现在我想在每个部分中放置一个 header 。 header 有 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
但是,您的上述值(value)观会有问题,这与您的
CC
值(value)。如果您从中删除顶部位,您将有效地将其更改为值
4C
这可能会导致您的短信系统错误地解释详细信息
正是出于这个原因,在几乎所有情况下,当直接处理二进制文件时,您都会使用 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 提供程序都提供某种开关/标志来执行此操作。
关于java - 为 7 位串联 SMS 创建 UDH,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27394251/