“Hello world”中的八位字节为:E8 32 9B FD 06 DD DF 72 36 19
如果应用填充,它将变为:D0 65 36 FB 0D BA BF E5 6C 32
(从wiki复制)
我能否知道使用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位填充编码消息。但我不是真的理解这个概念,有人可以教我吗? 感谢。
答案 0 :(得分:2)
整体编码公式是相同的。
您所说的是在用户数据的开头添加一些位(在这种情况下为1位)填充,以便用户数据在八位字节和septet边界上开始。
这用于多部分SMS,其中用户数据头包含有关如何将部件重新组合成一条消息的基于八位字节的信息。某些接收设备可能无法解释UDH,因此通过确保后续数据在八位字节边界和septet边界上开始,这些设备将在消息的前面显示垃圾,但至少会正确解码消息文本。
您会发现将用户数据视为比特流而不是八位字节或septets会有所帮助。然后,您可以将其解释为十六进制八位字节(如问题顶部的示例中所示)或用于解码的打包GSM septets。实际上,如果你看看问题顶部的两个例子并将它们写成二进制比特流,你就可以很容易地发现这种关系。
答案 1 :(得分: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