2

我正在接收来自 GSM 调制解调器的 PDU 格式的短信;TP-User-Data 是“C8329BFD06DDDF72363904”
,我得到的是:“�2����r69”,而发送的短信是“Hello World!”。

这是我的java代码:

    private String fromPDUText(String PDUSMSText) {
    String endoding = PDUSMSText.substring(0, 2);
    PDUSMSText = PDUSMSText.substring(18);
    byte bs[] = new byte[PDUSMSText.length() / 2];
    for(int i = 0; i < PDUSMSText.length(); i += 2) {
        bs[i / 2] = (byte) Integer.parseInt(PDUSMSText.substring(i, i + 2), 16);
    }
    try {
        String out = new String(bs, "ASCII");
    } catch(UnsupportedEncodingException e) {
        e.printStackTrace();
        return "";
    } finally {
        return out;
    }
}
4

3 回答 3

1

输入以每个字符 7 位打包,这意味着每 8 个字节编码 9 个字符。为这种格式构建解析器可能是一种有趣的练习,也可能是一种令人沮丧的体验,这取决于你如何看待它。使用库可能会更好,快速的 Google 搜索会显示几个 代码 示例

于 2013-07-31T15:07:19.570 回答
1

这就是 7Bit 字符的打包方式:
Encoding-Decoding-7-bit-User-Data-for-SMS-PDU-PDU

于 2013-08-02T20:14:55.983 回答
0

就我个人而言,我发现最容易解决这类问题的方法是将其视为有一个管道,您可以在其中一端输入 8 位并在另一端检索 7 位。只要您从中读取的管道中至少有 7 位。当少于 7 位时,您需要添加更多位,以便向其写入 8 个新位。所以你需要的是:

  1. 可以容纳至少 14 位的管道(但为什么要便宜?使用 32 位 int !)。
  2. 在任何给定时刻跟踪管道中有多少位的计数器。

伪代码中的算法如下:

pipe = 0;
bitCount = 0;
while(hasMoreData())
{
  pipe |= readByte() << bitCount;
  bitCount += 8;
  while(bitCount >= 7)
  {
    writeByte(pipe & 0x7F);
    pipe >>= 7;
    bitCount -= 7;
  }
}
于 2014-04-01T07:47:42.497 回答