Я столько написал и случайно закрыл вкладку :(
Проблема
Теория
Кодировка
Итак, хотим спросить *102# или в хексах (кто не знает, см. http://holman.id.au/apps/ipsms/default_alphabet.html ):
0x2A 0x31 0x30 0x32 0x23 или в 7битном представлении:
0101010 0110001 0110000 0110010 0100011
Меняем их местами
0100011 0110010 0110000 0110001 0101010
Добавляем 5 нулей в начало и склеиваем
00000010 00110110 01001100 00011000 10101010
Снова переставляем их все и получаем что требовалось
AA 18 4C 36 02
Реализация алгоритма шифрования
function PDUCode( src : String ) : String;
var
//Temporary storage
tmpArray : array of Byte;
l : Integer; // Length of src
dummyBytes : Integer;
i, j : Integer;
curIx : Integer; // òåêóùèé áèòîâûé óêàçàòåëü
procedure PushBit( val : Byte );
begin
//setting current bit
tmpArray[ curIx div 8 ] := tmpArray[ curIx div 8 ] or (val shl (7 - (curIx mod 8)) );
curIx := curIx + 1;
end;
begin
result := '';
l := Length( src );
SetLength( tmpArray, l );
curIx := l; //l zeros in begining
//loop by characters, from tail
for i := l downto 1 do begin
//loob by bits, from head
for j := 6 downto 0 do begin
PushBit( (ord(src[i]) shr j) and 1 );
end;
end;
//bytes fill of zeros, ignored in transmition
//òàì ÷òî-òî íàïèñàíî ïðî òî, åñëè 7 íóëåé, ïðî ñïåö.ñèìâîëû, ÿ ïîêà çàáèë
dummyBytes := l div 8;
for i := (l - dummyBytes) - 1 downto 0 do begin
result := result + IntToHex( tmpArray[i], 2 );
end;
end;
|