Java将7位字符集八位字节转换为可读字符串(来自PDU SMS)

时间:2013-07-31 14:41:43

标签: java sms hex pdu utf-7

我正在接收来自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;
    }
}

3 个答案:

答案 0 :(得分:1)

输入以每个字符7位打包,这意味着每8个字节编码9个字符。构建这种格式的解析器可能是一种有趣的练习或令人沮丧的体验,具体取决于您如何使用它。您最好使用图书馆,快速Google搜索会显示several code examples

答案 1 :(得分:1)

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

答案 2 :(得分:0)

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

  1. 一个可以容纳至少14位的管道(但为什么要便宜?请使用32位int!)。
  2. 计数器跟踪任何给定时刻管道中有多少位。
  3. 伪代码中的算法如下:

    pipe = 0;
    bitCount = 0;
    while(hasMoreData())
    {
      pipe |= readByte() << bitCount;
      bitCount += 8;
      while(bitCount >= 7)
      {
        writeByte(pipe & 0x7F);
        pipe >>= 7;
        bitCount -= 7;
      }
    }