【问题标题】:Converting special characters into 7 bit data for a PDU string in C#在 C# 中将特殊字符转换为 PDU 字符串的 7 位数据
【发布时间】:2011-11-15 03:24:19
【问题描述】:

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

  1. 将字符串中的每个字符转换为 ASCII 值
  2. 将 ASCII 值转换为 7 位二进制
  3. 使用this method - 将 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 上的转换),但我现在确实有足够的关于二进制和二进制转换的知识知道如何正确处理。

【问题讨论】:

  • ASCII 没有 值 248。ASCII 是 7 位编码。您需要弄清楚您真正在谈论哪种编码。
  • 好吧 - 我查看了 MSDN,它说 ToInt32 提供 UTF-16 编码。所以不是 ASCII,而是 UTF-16
  • char 本质上是一个 UTF-16 代码单元。您根本不需要致电Convert.ToInt32。但基本上,如果你有非 ASCII 字符,你需要知道它们是如何表示的......
  • @Jon Skeet:他的字符是 7 位 GSM 字母表,只需要另一个 ascii 代码。丹尼尔看看我的回答。

标签: c# binary pdu 7-bit


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

编辑

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

干杯!

【讨论】:

  • 此外,您可以使用 UCS-2 字符集(容量减少)
  • whosrdaddy:我明白了,您能否给我一个提示,告诉我如何继续?因为我需要将此 7 位 GSM 十六进制转换为 8 位十六进制?我只是尝试搜索谷歌,它有很多与我想要的相反的方法,但没有可用的方法来反转代码。
  • Shaw:你的解决方案很优雅,但我不应该使用 UCS-2 字符集。
  • @Daniel:首先将 ASCII 输入字符转换为 7 位 GSM 字母表(又名 Translationtable)中的对应字符。然后将该字符串编码为 7 位 PDU 序列。
  • 是的,但它的 7 位 PDU 编码对我来说有点模糊,因为根据这个例子:dreamfabric.com/sms/hello.html - 我需要 7 位二进制才能将其转换为 8 位二进制和然后到 7 位数据的 8 位表示。所以,是的,我可以轻松创建一个数组,为任何给定字符提供 7 位 GSM 十六进制。但是如何将其转换为 8 位表示是困难的部分。
猜你喜欢
  • 1970-01-01
  • 2013-03-08
  • 1970-01-01
  • 2015-02-20
  • 2019-02-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-07-21
相关资源
最近更新 更多