0

次のことが必要な PDU エンコーダーを作成しようとしています。

  1. 文字列内の各文字を ASCII 値に変換します
  2. ASCII 値を 7 ビット バイナリに変換します
  3. この方法を使用して- 7 ビットを 8 ビットに変換します。最初のセプテットを取得し、次のセプテットの終わりから最初のセプテットが8ビットになるまで追加することにより、関数でこれを行っています(URLに示されているように)。これは基本的にずっと続いています。
  4. 8 ビット バイナリを使用して、PDU 文字列を 16 進数に変換できます。

以下を使用すると、これらすべてが正常に機能します。

  1. ASCII = Convert.ToInt32(char)
  2. Convert.ToString(ASCII, 2)= 7ビット
  3. SeptetToOctet(7bit)= 8bit (私の機能)
  4. Convert.ToString(Convert.ToInt32(8bit, 2), 16).ToUpper()(1文字のみに変換する場合は0を追加しています)

ここで問題が発生します。デンマーク語の「ø」などの特殊文字を変換しようとすると、ASCII 値 248 がConvert.ToString(248, 2)得られます。これにより、 11111000(8 ビット) が得られます。したがって、'ø' を 7 ビット バイナリに強制的に変換する方法を知る必要があるか、または SeptetToOctet 変換 (これは提供された URL の変換) を修正する必要がありますが、バイナリとバイナリ変換について十分な知識を持っています。それを正しくする方法。

4

1 に答える 1

1

ダニエル、

ここを見て:

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

0x0B または 0x0C に変換する必要があります (大文字に応じて)

7 ビット GSM から ASCII (エンコーディング) へ、およびその逆の変換テーブルを作成します。これにより、生活が楽になります。

ここにデルファイの小さなサンプルがあります(OOPが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 は元の入力文字列です。各文字は、対応する GSM アルファベットを含む Latin1ToGsm 配列のインデックスとして機能するバイトに変換されます。返された値が 0 未満の場合は、拡張文字 (€ 記号など) があることを意味し、エスケープ文字 (0x027) を前に送信する必要があることを意味します。

編集

C# でそれを行う方法を説明するリンクは次のとおりです

乾杯!

于 2011-09-12T08:39:17.573 に答える