将VFP WRITETEXT / READTEXT转换为byte []?

时间:2018-09-24 13:53:48

标签: c#

我遇到了一个有趣的情况。使用20年前编写的旧版Visual Fox Pro 9应用程序,该应用程序使用SQL Server 2008(以及以上版本取决于客户端)。 当时,他们选择将Microsoft Word文档的内容(字节而不是文本提取)保存到SQL Server中的文本列。在Fox Pro中,应用程序读取 使用READTEXT写入字节,并使用WRITETEXT写入。通过这种方式,可以在应用程序中的许多地方引用这些文档。所以目前来看,实际上还不是 对于我来说,通过添加varbinary(max)列来更正此问题是可行的,并且只需修复数据,而在更改时不会引入大量风险 Fox Pro应用程序中有很多地方。我的截止日期只是取消了这个选项。

真正的问题是,我们引入了.NET支持的应用程序,这些应用程序与同一个数据库进行交互,这是我们远离.NET的一部分 福克斯临。我在将本表的DataTable中返回的巨大字符串转换为byte []时遇到问题。并且,当然,在保存 通过.NET以相同的格式返回文档,所以我不会破坏Fox Pro应用程序。

我猜想这与编码有关,但是我尝试过的基本操作,例如将base64编码为byte [],但不起作用。这是 从每个文档开始的一小段字符串:

“ 7B5C727466315C616465666C616E67313032355C616E73695C”

其余的巨大字符串是相同的字母数字值集。任何人都可以向我指出正确的方向,以将转换处理为一个字节[],然后 然后回到这个烂摊子?

1 个答案:

答案 0 :(得分:1)

它看起来像十六进制:7B 5C 72 74 66等,当转换回文本时,我得到的是:{\rtf1\adeflang1025\ansi\。因此,看起来它使用十六进制字节来读写RTF文档。

您可以尝试使用以下代码将十六进制文本转换回原始字节:

public static void Main()
{
    var hex = "7B5C727466315C616465666C616E67313032355C616E73695C";
    var rtfBytes = FromHex(hex);
    var rtfText = Encoding.ASCII.GetString(rtfBytes);
    Console.WriteLine(rtfText);
}

public static byte[] FromHex(string hex)
{
    var result = new byte[hex.Length / 2];
    for (var i = 0; i < result.Length; i++)
    {
        result[i] = Convert.ToByte(hex.Substring(i * 2, 2), 16);
    }
    return result;
}

请参见DotnetFiddle