c#中将PDU字符串的特殊字符转换为7位数据
本文关键字:转换 7位 数据 特殊字符 中将 PDU 字符串 | 更新日期: 2023-09-27 18:08:23
我正在尝试创建一个PDU编码器,这需要我:
- 将字符串中的每个字符转换为ASCII值
- 将ASCII值转换为7位二进制
- 使用此方法-将7位转换为8位。我在一个函数中这样做,取第一个七字节,并从下一个七字节的末尾添加,直到第一个有8位(如url中所示)。这基本上贯穿了整个过程。
- 使用8位二进制我可以转换为十六进制我的PDU字符串。
当使用
时,所有这些都可以正常工作。-
ASCII = Convert.ToInt32(char)
-
Convert.ToString(ASCII, 2)
= 7bit -
SeptetToOctet(7bit)
= 8bit (My function) -
Convert.ToString(Convert.ToInt32(8bit, 2), 16).ToUpper()
(我添加一个0,如果它转换为只有1个字符)
现在是我的问题,当试图转换特殊字符,如丹麦'ø',你得到248的ASCII值,其中Convert.ToString(248, 2)
给我11111000
(8位)。因此,要么我需要知道如何强制'ø'转换为7位二进制,要么SeptetToOctet转换(这是URL上提供的转换)需要修改,但我现在确实有足够的关于二进制和二进制转换的知识,知道如何正确使用。
看这里: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
干杯!