【问题标题】:GSM 7-bit encoding with 1 bit paddingGSM 7 位编码,1 位填充
【发布时间】:2011-12-27 17:10:44
【问题描述】:

来自“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


    【解决方案1】:

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

    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
    

    【讨论】:

    • 哦,我明白了。非常感谢 Ilmari,我现在明白了。再次感谢。
    【解决方案2】:

    整体编码公式相同。

    您所说的是在用户数据的开头添加一些位(在本例中为 1 位)填充,以便用户数据在八位字节和七位字节边界上都开始。

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

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

    【讨论】:

    • 不太明白但还是谢谢你(我是二进制的新手)。我尝试在公式中 +1,但只有 2 或 3 位不一样。
    • 是的,我知道它用于发送多部分短信,这就是我需要它的原因。
    猜你喜欢
    • 2012-10-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-14
    • 1970-01-01
    • 2012-09-22
    相关资源
    最近更新 更多