0

我正在尝试创建一个 PDU 编码器,它需要我:

  1. 将字符串中的每个字符转换为 ASCII 值
  2. 将 ASCII 值转换为 7 位二进制
  3. 使用这种方法- 将 7 位转换为 8 位。我通过获取第一个 septet 并从下一个 septet 的末尾添加直到第一个 8 位(如 url 中所示)在一个函数中执行此操作。这基本上贯穿始终。
  4. 使用 8 位二进制我可以将我的 PDU 字符串转换为十六进制。

使用时所有这些都可以正常工作:

  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)

现在我的问题来了,当尝试转换特殊字符时,比如丹麦语'ø',你会得到 248 的 ASCII 值,这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(您的编码),反之亦然。这将使您的生活更轻松。

这是 delphi 中的一个小示例(我知道 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# 中执行此操作的链接:http: //codeglobe.blogspot.com/2009/02/sending-sms-in-cnet-using-gsm-modem-and.html

干杯!

于 2011-09-12T08:39:17.573 回答