【发布时间】:2009-05-07 08:06:20
【问题描述】:
我正在编写一个 C# 应用程序,它从 VB6 代码生成的 SQL 数据库中读取数据。数据是一个 Singles 数组。我正在尝试将它们转换为 float[]
下面是在数据库中写入数据的VB6代码(不能更改此代码):
Set fso = New FileSystemObject
strFilePath = "c:\temp\temp.tmp"
' Output the data to a temporary file
intFileNr = FreeFile
Open strFilePath For Binary Access Write As #intFileNr
Put #intFileNr, , GetSize(Data, 1)
Put #intFileNr, , GetSize(Data, 2)
Put #intFileNr, , Data
Close #intFileNr
' Read the data back AS STRING
Open strFilePath For Binary Access Read As #intFileNr
strData = String$(LOF(intFileNr), 32)
Get #intFileNr, 1, strData
Close #intFileNr
Call Field.AppendChunk(strData)
如您所见,数据被放在一个临时文件中,然后作为VB6 String 读回并写入数据库(dbLongBinary 类型的行)
我尝试了以下方法:
进行块复制
byte[] source = databaseValue as byte[];
float [,] destination = new float[BitConverter.ToInt32(source, 0), BitConverter.ToInt32(source, 4)];
Buffer.BlockCopy(source, 8, destination, 0, 50 * 99 * 4);
这里的问题是 VB6 二进制到字符串的转换。 VB6 字符串 char 有 2 个字节宽,我不知道如何将其转换回我可以处理的二进制格式。
下面是 VB6 代码生成的临时文件的转储: alt text http://robbertdam.nl/share/dump%20of%20text%20file%20generated%20by%20VB6.png
这是我从数据库中读取的数据转储(=VB6 字符串): alt text http://robbertdam.nl/share/dump%20of%20database%20field.png
【问题讨论】:
-
你确定你有正确的二进制转储吗?我可以看到 LINQ 为某些序列引入的 unicode 填充,但它们并不完全匹配。
-
但是两者都是相同大小的数组 a (0 到 2, 0 到 12) 所以我认为如果将它复制到另一个字节数组中并跳过每隔一个字节你应该对其余的代码很好我发布了。
-
那么 C# 代码必须处理每个字节和每个浮点数的字节数?
-
如果我错了,请原谅我,但这与您 4 月 24 日的问题不完全相同吗? stackoverflow.com/questions/785181/…
-
哦,我刚看到你的PS。也许版主可以为你合并问题,如果有的话。我相信他们有这种力量。