我正在尝试创建一个PDU编码器,它要求我:
使用时所有这些都可以正常工作:
ASCII = Convert.ToInt32(char)
Convert.ToString(ASCII, 2)
= 7位SeptetToOctet(7bit)
= 8位(我的功能)Convert.ToString(Convert.ToInt32(8bit, 2), 16).ToUpper()
(如果它只转换为1个字符,我会添加0)现在出现了问题,当我尝试转换特殊字符时,比如丹麦语'ø',你得到的是248的ASCII值,Convert.ToString(248, 2)
给我11111000
(8位)。所以要么我需要知道如何强制将'ø'转换为7位二进制,要么知道SeptetToOctet转换(这是对提供的URL的转换)需要修改,但我现在已经知道有关二进制和二进制转换的知识了解如何做对。
答案 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
干杯!