我们正在重写以前在Visual FoxPro中开发的一些应用程序,并使用.Net重新开发它们(使用C#)
以下是我们的方案: 我们的应用程序使用智能卡。我们从智能卡中读取数据,该智能卡具有名称和编号。这个名字在可读的文字中回来了,但数字,在这种情况下'900'以2字节字符表示形式(131& 132)回来,看起来像这样 - ƒ“
在扩展的Ascii表中可以看到这两个特殊字符..现在您可以看到2个字节是131和132并且可以变化,因为没有单个标准扩展ascii表(据我所知,读一些这里的帖子)
所以...之前使用VFP中的BINTOC功能编写了智能卡,因此将900写入卡中作为“f”。在foxpro中,这两个特殊字符可以使用CTOBIN函数转换回整数格式..另一个内置函数在FoxPro中..
所以(最后说到这一点) - 到目前为止,我们无法将这两个特殊字符转换回int(900),我们想知道在.NET中是否可以读取整数的字符表示形式回到实际的整数。
或者有没有办法在C#中重写这2个VFP函数的逻辑?
更新: 经过一番调整,我们意识到要将900转换为2字节,我们需要将900转换为16位二进制值,然后我们需要将该16位二进制值转换为十进制值。
因此,如上所述,我们正在接收131和132及其对应的二进制值为10000011(十进制值131)和10000100(十进制值132)。 当我们将这两个值连接到'1000001110000100'时,它给出十进制值33668但是如果我们删除了前导1并将'000001110000100'变换为十进制,则它给出正确的值900 ...
不太确定为什么会这样......
任何帮助都将不胜感激。
答案 0 :(得分:0)
看起来VFP将您的值存储为带符号的16位(短)整数。对于负数而言,似乎有一个奇怪的转换点,但它增加了128到8位数,并将32768添加到16位数。
因此,从字符串转换16位数字应该像读取16位整数一样简单,然后从32768开始。如果必须手动执行此操作,则必须将第一个数字乘以256,然后添加第二个数字以获取存储的值。然后从这个数字中取32768以获得你的价值。
示例:
131 * 256 = 33536
33536 + 132 = 33668
33668 - 32768 = 900
您可以尝试按照http://msdn.microsoft.com/en-us/library/ms131059.aspx和http://msdn.microsoft.com/en-us/library/tw38dw27.aspx使用C#转换为您完成至少部分工作,但如果不能,则手动编写上述内容应该不会太难。< / p>
答案 1 :(得分:0)
晚了几年,但这里有一个有效的例子。
public ulong CharToBin(byte[] s)
{
if (s == null || s.Length < 1 || s.Length > 8)
return 0ul;
var v = s.Select(c => (ulong)c).ToArray();
var result = 0ul;
var multiplier = 1ul;
for (var i = 0; i < v.Length; i++)
{
if (i > 0)
multiplier *= 256ul;
result += v[i] * multiplier;
}
return result;
}
这是 CTOBIN 的 VFP 8 和更早版本的等效版本,涵盖了您的场景。您应该能够根据上面的代码编写自己的 BINTOC。 VFP 9 添加了对多个选项的支持,例如非反向二进制数据、货币和双精度数据类型以及有符号值。此示例仅涵盖像支持的旧 VFP 那样的反向无符号二进制。
一些注意事项:
System.UInt64
的无符号数值。Int32.MaxValue
。Encoding.ASCII
,但这取决于应用程序。