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

本文关键字:转换 7位 数据 特殊字符 中将 PDU 字符串 | 更新日期: 2023-09-27 18:08:23

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

  1. 将字符串中的每个字符转换为ASCII值
  2. 将ASCII值转换为7位二进制
  3. 使用此方法-将7位转换为8位。我在一个函数中这样做,取第一个七字节,并从下一个七字节的末尾添加,直到第一个有8位(如url中所示)。这基本上贯穿了整个过程。
  4. 使用8位二进制我可以转换为十六进制我的PDU字符串。

当使用

时,所有这些都可以正常工作。
  1. ASCII = Convert.ToInt32(char)
  2. Convert.ToString(ASCII, 2) = 7bit
  3. SeptetToOctet(7bit) = 8bit (My function)
  4. Convert.ToString(Convert.ToInt32(8bit, 2), 16).ToUpper()(我添加一个0,如果它转换为只有1个字符)

现在是我的问题,当试图转换特殊字符,如丹麦'ø',你得到248的ASCII值,其中Convert.ToString(248, 2)给我11111000(8位)。因此,要么我需要知道如何强制'ø'转换为7位二进制,要么SeptetToOctet转换(这是URL上提供的转换)需要修改,但我现在确实有足够的关于二进制和二进制转换的知识,知道如何正确使用。

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

看这里: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

干杯!