Php GSM 7位编码,带1位填充

Php GSM 7位编码,带1位填充,php,binary,decimal,Php,Binary,Decimal,“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;

“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">
maxkeys=160;
函数binToInt(x)//sp
{
var合计=0;
var-power=parseInt(x.length)-0;
对于(变量i=0;i(j*8+4))&0x0F)+
字符((i>>(j*8))&0x0F);
}
返回h.子串(0,2);
}
函数stringToPDU(输入字符串,大小)
{
变量bitSize=size[0]。值*大小[0]。选中的|大小[1]。值*大小[1]。选中的|大小[2]。值*大小[2]。选中的;
var octetFirst=“”;
var octetSecond=“”;
var输出=”;
var数据_ENCODING=“00”;
var有效期=“AA”;
var-userDataSize;
如果(位大小==7)
{
userDataSize=intToHex(inpString.length);

对于(var i=0;i而言,整体编码公式是相同的

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

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


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

整个编码公式是相同的

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

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


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

将这些八位字节以二进制形式写出(每个八位字节中的最低位放在第一位),您将看到:

E8 32 9B FD 06 DD DF 72 36 19=00010111 01001100 11011001 10111111 01100000 10111011 11111 011 01001110 01101 101100 10011000
D0 65 36 FB 0D BA BF E5 6C 32=00001011 10100110 011010 11011111 10110000 01011101 111111 01 10100111 00110110110 01001100

以二进制形式写出这些八位字节(每个八位字节的第一位是最低位),您将看到:

E8 32 9B FD 06 DD DF 72 36 19=00010111 01001100 11011001 10111111 01100000 10111011 11111 011 01001110 01101 101100 10011000
D0 65 36 FB 0D BA BF E5 6C 32=00001011 10100110 011010 11011111 10110000 01011101 111111 01 10100111 00110110110 01001100

我不太懂,但还是要谢谢你(我对二进制很陌生)。我尝试在公式中加1,但只有2或3位不一样。是的,我知道它是用来发送多部分短信的,这就是我需要它的原因。我不太懂,但还是要谢谢你(我对二进制很陌生).我尝试在公式中使用+1,但只有2或3位是不一样的。是的,我知道它用于发送多部分短信,这就是我需要它的原因。哦,我看到了。非常感谢Ilmari,我现在明白了。再次感谢。哦,我看到了。非常感谢Ilmari,我现在明白了。再次感谢。