【问题标题】:Java Convert 7bit Charset Octets to Readable String (From PDU SMS)Java 将 7 位字符集八位字节转换为可读字符串(来自 PDU SMS)
【发布时间】:2013-07-31 14:41:43
【问题描述】:

我正在接收来自 GSM 调制解调器的 PDU 格式的短信; TP 用户数据是“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;
    }
}

【问题讨论】:

  • 你解决过这个问题吗?我正在寻找类似的困境。我已经尝试了以下示例之一,但仍然得到垃圾。不知道为什么!

标签: java sms hex pdu utf-7


【解决方案1】:

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

【讨论】:

  • 我可以构建解析器,但我不知道该怎么做!我用谷歌搜索了很多,但我不知道从哪里开始!
  • 您需要使用按位运算符,例如通过取a 的3 个最低位和b 的4 个最高位来创建一个值做(a &amp; 0x7) &lt;&lt; 4) | ((b &gt;&gt; 3) &amp; 0xf)
  • 我尽了最大努力,但我得到的是以下内容:在“C8329BFD06”(代表“Hello”)中,位模式为:11001000 00110010 10011011 11111101 00000110 以及 ASCII 表中以下字符的二进制值是: H: 01001000 e: 01100101 l: 01101100 l: 01101100 o: 01101111 我不知道如何解释这个位模式以从中获取提到的字符! :(
【解决方案2】:

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

【讨论】:

    【解决方案3】:

    就我个人而言,我发现最容易解决这类问题的方法是,将其视为一个管道,在该管道的一端输入 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;
      }
    }
    

    【讨论】:

      猜你喜欢
      • 2012-05-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-09-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多