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

Я пытаюсь создать кодировщик 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-адресу) требует пересмотра, но теперь у меня достаточно знаний о двоичном и двоичном преобразовании, чтобы знать как сделать это правильно.


person Daniel Olsen    schedule 12.09.2011    source источник
comment
ASCII не имеет имеет значение 248. ASCII — это 7-битная кодировка. Вам нужно выяснить, о какой кодировке вы на самом деле говорите.   -  person Jon Skeet    schedule 12.09.2011
comment
Что ж, я посмотрел MSDN, и там написано, что ToInt32 обеспечивает кодировку UTF-16. Так что не ASCII, а UTF-16   -  person Daniel Olsen    schedule 12.09.2011
comment
Ну, char по своей сути является кодовой единицей UTF-16. Вам вообще не нужно звонить Convert.ToInt32. Но в основном, если у вас есть символы, отличные от ASCII, вам нужно знать, как они должны быть представлены...   -  person Jon Skeet    schedule 12.09.2011
comment
@Jon Skeet: его персонаж в 7-битном GSM-алфавите, просто нужен другой код ascii. Даниил, посмотри мой ответ.   -  person whosrdaddy    schedule 12.09.2011


Ответы (1)


Даниэль,

Смотри сюда:

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

Вам нужно преобразовать в 0x0B или 0x0C (в зависимости от заглавных букв)

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

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

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) впереди.

ИЗМЕНИТЬ

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

Ваше здоровье!

person whosrdaddy    schedule 12.09.2011
comment
Кроме того, вы можете использовать набор символов UCS-2 (с уменьшенной емкостью). - person Rowland Shaw; 12.09.2011
comment
whosrdaddy: Ясно, можно мне подсказать, как мне поступить? Потому что мне нужно преобразовать этот 7-битный шестнадцатеричный код GSM в 8-битный шестнадцатеричный? Я только что попытался выполнить поиск в Google, в котором было много способов сделать противоположное тому, что я хочу, но не было пригодного для использования способа изменить код. - person Daniel Olsen; 12.09.2011
comment
Шоу: Ваше решение элегантно, но мне не нужно использовать набор символов UCS-2. - person Daniel Olsen; 12.09.2011
comment
@Daniel: сначала преобразуйте входные символы ASCII в их аналоги в 7-битном алфавите GSM (он же Translationtable). Затем закодируйте эту строку в 7-битную последовательность PDU. - person whosrdaddy; 12.09.2011
comment
Да, но для меня 7-битная кодировка PDU немного туманна, потому что, согласно этому примеру: dreamfabric. com/sms/hello.html — мне нужен 7-битный двоичный код, чтобы иметь возможность преобразовать его в 8-битный двоичный файл, а затем в 8-битное представление 7-битных данных. Так что да, я могу легко создать массив, который предоставляет 7-битный шестнадцатеричный код GSM для любого заданного символа. Но как получить это в 8-битном представлении - сложная часть. - person Daniel Olsen; 12.09.2011
comment
Дэниелс, все символы ASCII представлены одним байтом. то же самое можно сказать и о 7-битном аналоге GSM (значение никогда не будет больше 0x7F, т. е. никогда не будет установлен старший бит). Вам нужно перетасовать биты из других символов в 7-битный поток. Начните с первого символа, сдвиньте влево, чтобы младший бит был старшим битом (от бита 7) следующего символа. - person whosrdaddy; 12.09.2011