Visual FoxPro(VFP)CTOBIN和BINTOC函数 - 等效于.Net

时间:2012-02-16 09:59:07

标签: c# encoding ascii smartcard visual-foxpro

我们正在重写以前在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 ...

不太确定为什么会这样......

任何帮助都将不胜感激。

2 个答案:

答案 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.aspxhttp://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 那样的反向无符号二进制。

一些注意事项:

  • 代码支持1、2、4、8字节值,涵盖了所有 最大为 System.UInt64 的无符号数值。
  • 在投射之前 结果下降到您预期的数字类型,您应该验证 天花板。例如,如果您需要一个 Int32,则检查结果 在执行演员之前对Int32.MaxValue
  • 示例通过接受一个字符串来避免字符串编码的复杂性 字节数组。您需要了解使用哪种编码 读取字符串,然后应用相同的编码来获取字节数组 在调用这个函数之前。在 VFP 世界中,这经常发生 Encoding.ASCII,但这取决于应用程序。