简单的问题.在C#中,同样功能的转换会是什么样的?
VB6:
Dim rec As String * 200
If rs!cJobNum <> "" Then
Open PathFintest & Mid(rs!cJobNum, 2, 5) & ".dat" For Random As #1 Len = 200
s = Val(Mid(rs!cJobNum, 7, 4))
Get #1, Val(Mid(rs!cJobNum, 7, 4)) + 1, rec
Close #1
TestRec = rec
Fail = FindFailure(TestRec)
End If
Run Code Online (Sandbox Code Playgroud)
这是我在C#中的尝试(没有返回类似的结果):
FileStream tempFile = File.OpenRead(tempPath);
var tempBuf = new byte[200];
var tempOffset = Int32.Parse(StringHelper.Mid(rs.Fields["cJobnum"].Value, 7, 4)) + 1;
tempFile.Seek(tempOffset , SeekOrigin.Begin);
tempFile.Read(tempBuf, 0, 200);
rec.Value = new string(System.Text.Encoding.Default.GetChars(tempBuf));
tempFile.Close();
TestRec = rec.Value;
Fail = (string)FindFailure(ref TestRec);
Run Code Online (Sandbox Code Playgroud)
在VB6中,字符串存储为Unicode.在内存中,VB6字符串存储4个字节的开销,每个字符加2个字节,因此您的语句Dim rec As String * 200实际上分配4 + 200 * 2了内存字节,即404字节.由于VB6字符串和C#字符串都是Unicode,因此您无需在此处更改任何内容.
GetVB6中的命令从文件中检索字节.格式是Get [#]filenumber, [byte position], variableName.这将检索许多字节variableName,从偏移量开始byte position.VB6中的字节位置从1开始.
现在,要翻译代码,它看起来应该类似于:
int pos = (rs.Fields["cJobnum"].Value).SubString(6, 4);
tempFile.Read(tempBuf, pos - 1, 200);
Run Code Online (Sandbox Code Playgroud)
请注意,SubString它基于0并且基于Mid1,因此我使用6而不是7.此外,该Read方法中的偏移量是基于0的.Get在VB6中是基于1的,所以我们减去一个.