【发布时间】:2012-02-16 09:59:07
【问题描述】:
我们正在重写一些以前在 Visual FoxPro 中开发的应用程序,并使用 .Net(使用 C#)重新开发它们
这是我们的场景: 我们的应用程序使用智能卡。我们从具有名称和编号的智能卡中读取数据。名称在可读文本中恢复正常,但数字,在这种情况下,“900”以 2 字节字符表示(131 和 132)的形式返回,看起来像这样 - ƒ„
这 2 个特殊字符可以在扩展的 Ascii 表中看到。现在你可以看到 2 个字节是 131 和 132,并且可以变化,因为没有单一的标准扩展 ascii 表(据我所知,阅读一些这里的帖子)
所以...智能卡之前是使用 VFP 中的 BINTOC 函数写入的,因此 900 被写入卡中作为 ƒ„。在 foxpro 中,这 2 个特殊字符可以使用 CTOBIN 函数转换回整数格式.. FoxPro 中的另一个内置函数..
所以(终于切入正题)- 到目前为止,我们无法将这两个特殊字符转换回 int (900),我们想知道这是否可以在 .NET 中读取整数的字符表示返回一个实际的整数。
或者有没有办法用 C# 重写这两个 VFP 函数的逻辑?
更新: 经过一番摆弄,我们意识到要将 900 转换为 2 字节,我们需要将 900 转换为 16 位二进制值,然后我们需要将 16 位二进制值转换为十进制值。
如上所述,我们收到了 131 和 132 以及它们对应的二进制值,分别为 10000011(十进制值 131)和 10000100(十进制值 132)。 当我们将这两个值连接到“1000001110000100”时,它会给出十进制值 33668,但是如果我们删除前导 1 并将“000001110000100”转换为十进制,它会给出正确的值 900...
不太清楚为什么会这样……
任何帮助将不胜感激。
【问题讨论】:
-
问题已解决。我们将数字 900 转换为二进制,将 9 - 16 (内含)的值作为我们的第二个字节,并获取剩余的值并使用前导 1 对其进行更新,因为该数字 > 127。这在转换任何数字的两个方向上都有效> 127(并且小于 32,7??无论上限是多少)
-
示例:二进制中的 900 = 1110000100。取最后 8 位 (10000100) 并转换为十进制 = 132。取前 2 位 (11) 并应用 5 个后续 0,并以二进制值开头一个 1,所以它看起来像这样 - 10000011。将其转换为十进制,它是 131。现在要将 131、132 十进制值重新转换为单个二进制值以转换回十进制,我们将它们单独转换并将它们连接起来给我们1000001110000100。现在,只需将位置 1 中的 1 替换为 0 即可得到原始的 16 位二进制值,如果我们使用 2 x 位块,我们只需要开头的 1
-
如果您认为您的问题已得到充分回答,请随时将其发布为您问题的答案。这将允许您将此问题标记为已回答。
-
您可以将整个问题重写为“如何使用 C# 将使用 VFP BINTOC() 函数存储的 16 位有符号整数转换为十进制”,这将使它对其他人更有用读者也不太可能因为过于本地化而被关闭。
标签: c# encoding ascii smartcard visual-foxpro