java - 为 7 位串联 SMS 创建 UDH

标签 java string header sms concatenation

我需要发送串联的短信,我将消息(超过 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/

相关文章:

java - Gson 正在向我的 JSON 字符串添加斜杠

java - 如何将泛型类型转换为String

python - 如何使用先前列表中的所有匹配项创建新的字符串列表?

javascript - 使用prototype.js获取响应头

php - 在 PHP 中使用 Header 作为下载链接

java - org.junit 包和 junit.framework 包有什么区别?

java - Spring MVC 网站管理/配置页面的推荐数据模型和数据源?

c - 字符串和结构的奇怪行为

PHP header 刷新警告

java - Android 上的 Appium : assert object properties (focused, 已启用,...)