在C#中将特殊字符转换为PDU字符串的7位数据

时间:2011-09-12 08:05:05

标签: c# binary pdu 7-bit

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

  1. 将字符串中的每个字符转换为ASCII值
  2. 将ASCII值转换为7位二进制
  3. 使用this method - 将7位转换为8位。 我在一个函数中执行此操作,取第一个septet,并从下一个septet的末尾添加,直到第一个有8位(如url中所示)。这基本上都是持续的。
  4. 使用8位二进制文​​件我可以将我的PDU字符串转换为十六进制。
  5. 使用时所有这些都可以正常工作:

    1. ASCII = Convert.ToInt32(char)
    2. Convert.ToString(ASCII, 2) = 7位
    3. SeptetToOctet(7bit) = 8位(我的功能)
    4. Convert.ToString(Convert.ToInt32(8bit, 2), 16).ToUpper()(如果它只转换为1个字符,我会添加0)
    5. 现在出现了问题,当我尝试转换特殊字符时,比如丹麦语'ø',你得到的是248的ASCII值,Convert.ToString(248, 2)给我11111000(8位)。所以要么我需要知道如何强制将'ø'转换为7位二进制,要么知道SeptetToOctet转换(这是对提供的URL的转换)需要修改,但我现在已经知道有关二进制和二进制转换的知识了解如何做对。

1 个答案:

答案 0 :(得分:1)

丹尼尔,

看这里:

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

您需要转换为0x0B或0x0C(取决于大写)

制作7bit 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是原始输入字符串。 每个字符都转换为一个字节,作为索引 Latin1ToGsm数组,包含GSM字母对应物。 如果返回的值低于0,则表示我们有一个扩展字符(如€符号),这意味着你需要在前面发送一个转义字符(0x027)。

修改

这是一个解释如何在C#中执行此操作的链接: http://codeglobe.blogspot.com/2009/02/sending-sms-in-cnet-using-gsm-modem-and.html

干杯!