2011-11-12 14 views
0

從「世界,你好」的字節是:GSM 7位編碼,1個比特填充

如果應用填充它會成爲: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 = "ABCDEF"; 
    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

寫出二進制的八位字節(與最低位首先在每個字節),你會看到它:

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 
+0

哦,我明白了。非常感謝Ilmari,我現在明白了。再次感謝。 –

1

整體編碼公式是相同的。

你說的是在用戶數據的開始處添加一些填充位(在本例中爲1位),以便用戶數據在八位字節和七位字節邊界上開始。

這是用於多部分SMS,其中用戶數據標頭包含有關如何將部件重新組裝成一條消息的(基於字節的)信息。一些接收設備可能無法解釋UDH,因此通過確保後續數據在八位字節邊界和七段邊界上開始,那些設備將在消息的前面顯示垃圾,但至少會正確解碼消息文本。

你會發現將用戶數據視爲比特流而不是八位字節或七位字節有幫助。然後,您可以將其解釋爲十六進制八位組(如您在問題頂部的示例)或者將其解碼爲包裝的GSM septets。事實上,如果你看問題頂部的兩個例子,並將它們寫成二進制比特流,你很容易發現這種關係。

+0

不是很懂,但仍三江源(我很新二進制)。我試圖在公式中+1,但只有2或3位不相同。 –

+0

是的,我知道這是用來發送多部分的短信,這就是爲什麼我需要它。 –