Преобразование специальных символов в 7-битные данные для строки PDU в C # - PullRequest
0 голосов
/ 12 сентября 2011

Я пытаюсь создать кодер PDU, который требует от меня:

  1. Конвертировать каждый символ в строке в значение ASCII
  2. Преобразование значения ASCII в 7-разрядный двоичный код
  3. Используя этот метод - Преобразование 7-разрядного в 8-разрядное. Я делаю это в функции, беря первый септет и добавляя от конца следующего септета до тех пор, пока у первого не будет 8 бит (как показано в URL). Это продолжается в основном.
  4. Используя 8-битный двоичный код, я могу преобразовать его в шестнадцатеричное для своей строки PDU.

Все это прекрасно работает при использовании:

  1. ASCII = Convert.ToInt32(char)
  2. Convert.ToString(ASCII, 2) = 7 бит
  3. SeptetToOctet(7bit) = 8 бит (Моя функция)
  4. Convert.ToString(Convert.ToInt32(8bit, 2), 16).ToUpper() (я добавляю 0, если он конвертируется только в 1 символ)

Теперь возникает моя проблема: при попытке конвертировать специальные символы, такие как датский 'ø', вы получаете значение ASCII 248, которое с Convert.ToString(248, 2) дает мне 11111000 (8 бит). Так что либо мне нужно знать, как принудительно преобразовать 'ø' в 7-битный двоичный код, либо преобразование SeptetToOctet (это преобразование по предоставленному URL-адресу) нуждается в пересмотре, но теперь у меня достаточно знаний о двоичном и двоичном преобразовании, чтобы знать как правильно сделать.

1 Ответ

1 голос
/ 12 сентября 2011

Daniel

смотрите здесь:

http://www.dreamfabric.com/sms/default_alphabet.html

Вам необходимо преобразовать в 0x0B или 0x0C (в зависимости от столицы)

Сделать перевод для 7-битного GSM в ASCII (ваша кодировка) и наоборот. Это сделает вашу жизнь проще.

Вот небольшой пример в Delphi (я знаю, что ООП запрашивает C #, но принцип остается прежним)

function CharsetLatin1ToGsm(v : string) : string;

var Ps,I : Integer;
    Len  : Integer;
    c    : Char;

begin
 Result := '';
 if v = '' then Exit;
 Ps := 1;
 Len := Length(v);
 while Ps <= Len do
  begin
   c := v[Ps];
   I := Latin1ToGsm[Byte(c)];
   if I < 0 then
    begin
     Result := Result+#27+Chr(-I);
    end
   else
    Result := Result+Chr(I);
   Inc(Ps);
  end;
end;

Маленькое объяснение:

v - исходная строка ввода. каждый символ преобразуется в байт, который служит индексом для Latin1ToGsm массив, который содержит аналоги алфавита GSM. если возвращаемое значение меньше 0, это означает, что у нас есть расширенный символ (например, знак €), и это означает, что вам нужно отправить перед собой escape-символ (0x027).

EDIT

вот ссылка, которая объясняет, как это сделать в C #: http://codeglobe.blogspot.com/2009/02/sending-sms-in-cnet-using-gsm-modem-and.html

* * 1025 Ура! * * 1026
...