2014-12-18 1 views
6

간단한 질문입니다. C#에서와 같이 똑같이 작동하는 변환은 어떻게 생깁니 까?VB6에서 get 문과 동일한 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 

이 C#에서 내 시도 (유사한 결과를 반환하지 않습니다)이었다

VB6에서
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); 
+3

코드 서식을 지정하는 도움말 센터 문서를 읽으십시오. 코드 블록을 서식 지정하는 경우에는 백틱을 사용하지 말고 들여 씁니다. 그런 식으로 * 깔끔하게 보입니다. 당신은 VB6에 대해 모르는 사람들에게'Get'이 무엇을하는지 설명해야합니다. 그렇지 않으면 C# *와 * VB6를 아는 사람들에게 자신을 제한하고 있습니다 ... –

+3

@JohnSaunders : 아니요, .NET은 UTF를 사용합니다. ASCII 문자 만 포함하는 파일의 경우 ASCII와 동일합니다. –

+0

이것은 'Get'대신 'Put'을 사용했지만 내게 올바른 질문을 던집니다. http://stackoverflow.com/questions/8043167/how-to-read-and -write-interoperable-strings-to-a-binary-file-net-and-vb –

답변

5

, 문자열이 유니 코드로 저장되어가. 메모리에서 VB6 문자열은 4 바이트의 오버 헤드와 문자 당 2 바이트를 저장하므로 Dim rec As String * 200 문은 실제로 4 + 200 * 2 바이트 (404 바이트)의 메모리를 할당합니다. VB6 문자열과 C# 문자열은 모두 유니 코드이므로 여기에서 아무 것도 변경할 필요가 없습니다.

VB6의 Get 명령은 파일에서 바이트를 검색합니다. 형식은 Get [#]filenumber, [byte position], variableName입니다. 오프셋 byte position에서 시작하여 많은 바이트 인 variableName이 검색됩니다. 바이트 위치는 VB6에서 1 기준입니다.

int pos = (rs.Fields["cJobnum"].Value).SubString(6, 4); 
tempFile.Read(tempBuf, pos - 1, 200); 

공지 사항 SubString 즉, 0 기반 및 Mid 1 기반, 그래서 6 대신 7 사용 :

은 그래서 지금, 코드를 변환하는 데,이 유사합니다. 또한 Read 메서드의 오프셋은 0부터 시작합니다. VB6에서는 Get이 1 기반이므로 1을 뺍니다.

+0

감사합니다! 그게 문제를 해결 했어, 내가 말했듯이, 그 말은 날 곤경에 빠지게하는 간단한 수정이었다. 따라서 실제 바이트 오프셋은 실제로 "1000 x 200 = 200,000"이었으므로 머리에 직접 내 질문을 던졌습니다. – BluishMicrobe

관련 문제