具有1位填充的GSM 7位编码

问题描述 投票:0回答:2

来自“Hello world”的八位字节是:E8 32 9B FD 06 DD DF 72 36 19

如果应用填充,它将成为:D0 65 36 FB 0D BA BF E5 6C 32

(从维基复制)

我可以知道使用1位填充编码的公式是什么?

以下是我编辑的将字符串转换为PDU的公式:(感谢源代码提供者)*完整的公式有点长,所以我只是在这里发布一部分...

    maxkeys = 160;

    function binToInt(x)//sp
   {
var total = 0;  
var power = parseInt(x.length)-0;   

for(var i=0;i<x.length;i++)
{
    if(x.charAt(i) == '1')
    {
     total = total +Math.pow(2,power);
    }
    power --;
}
return total;
  }

  function intToHex(i) //sp
    {
     var sHex = "0123456789ABCDEF"; 
     h = ""; 
     i = parseInt(i);   
    for(j = 0; j <= 3; j++)
     {
      h += sHex.charAt((i >> (j * 8 + 4)) & 0x0F) +
        sHex.charAt((i >> (j * 8)) & 0x0F);
      }
    return h.substring(0,2);
   }


 function stringToPDU(inpString,size) 
     {

var bitSize = size[0].value * size[0].checked | size[1].value * size[1].checked | size[2].value * size[2].checked;

var octetFirst = "";
var octetSecond = ""; 
var output = "";

var DATA_ENCODING = "00"; 

var VALID_PERIOD = "AA";

var userDataSize;
if (bitSize == 7)
{

    userDataSize = intToHex(inpString.length);

    for(var i=0;i<=inpString.length;i++)
    {
        if(i==inpString.length)
        {
            if (octetSecond != "") // AJA Fix overshoot
            {
                output = output + "" + (intToHex(binToInt(octetSecond)));
            }
            break;
        }
        var current = intToBin(getSevenBit(inpString.charAt(i)),7);

        var currentOctet;
        if(i!=0 && i%8!=0)
        {
            octetFirst = current.substring(7-(i)%8);
            currentOctet = octetFirst + octetSecond;    

            output = output + "" + (intToHex(binToInt(currentOctet)));
            octetSecond = current.substring(0,7-(i)%8); 
        }
        else
        {
            octetSecond = current.substring(0,7-(i)%8);
        }   
    }
}

//var data =  DATA_ENCODING + VALID_PERIOD + userDataSize;

var PDU =   output;

return  PDU;
      }

    <input onclick="pduOut.value= stringToPDU(document.stringToPduForm.smsText.value.substring (0, maxkeys),document.stringToPduForm.size);" type="button" size="11" value="  Convert  " name="stringButton">

我需要知道需要进行哪些更改,以便公式可以使用1位填充编码消息。但我不是真的理解这个概念,有人可以教我吗?谢谢。

php binary decimal
2个回答
2
投票

用二进制写出那些八位字节(每个八位字节中的最低位),你会看到它:

E8 32 9B FD 06 DD DF 72 36 19 = 00010111 01001100 11011001 10111111 01100000 10111011 11111011 01001110 01101100 10011000
D0 65 36 FB 0D BA BF E5 6C 32 = 00001011 10100110 01101100 11011111 10110000 01011101 11111101 10100111 00110110 01001100

2
投票

整体编码公式是相同的。

你在谈论的是在用户数据的开头添加一些位(在这种情况下是1位)填充,以便用户数据在八位字节和septet边界上开始。

这用于多部分SMS,其中用户数据头包含关于如何将部件重新组装成一个消息的基于八位字节的信息。某些接收设备可能无法解释UDH,因此通过确保后续数据在八位字节边界和septet边界上开始,这些设备将在消息的前面显示垃圾,但至少会正确解码消息文本。

您会发现将用户数据视为比特流而不是八位字节或septets会有所帮助。然后,您可以将其解释为十六进制八位字节(如问题顶部的示例中所示)或用于解码的打包GSM septets。事实上,如果你看看问题顶部的两个例子并将它们写成二进制比特流,你就可以很容易地发现这种关系。

© www.soinside.com 2019 - 2024. All rights reserved.