GSM 7-битное кодирование с добавлением 1 бита - PullRequest
0 голосов
/ 12 ноября 2011

Октеты из "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-битным заполнением ... но я не совсем понимаю эту концепцию, кто-то может научить меня? Спасибо.

Ответы [ 2 ]

2 голосов
/ 13 ноября 2011

Запишите эти октеты в двоичном формате (с младшим битом первым в каждом октете), и вы увидите его:

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 голосов
/ 12 ноября 2011

Общая формула кодирования одинакова.

То, о чем вы говорите, - это добавление некоторого количества битов (в данном случае 1 бит) заполнения в начале пользовательских данных, чтобы пользовательские данные начинались как на границе октета, так и на границе септета.

Используется для составных SMS, где заголовок пользовательских данных содержит (на основе октетов) информацию о том, как собрать части в одно сообщение.Некоторые принимающие устройства могут не иметь возможности интерпретировать UDH, поэтому, гарантируя, что последующие данные начинаются как на границе октета, так и на границе септета, эти устройства будут отображать мусор в начале сообщения, но, по крайней мере, будут правильно декодировать текст сообщения.

Вы найдете, что это помогает воспринимать пользовательские данные как битовый поток, а не как октеты или септеты.Затем вы можете интерпретировать его как шестнадцатеричные октеты (как в вашем примере вверху вопроса) или как упакованные септеты GSM для декодирования.Фактически, если вы посмотрите на свои два примера в верхней части вопроса и запишите их как двоичные потоки битов, вы легко заметите взаимосвязь.

...