2014-12-18 15 views
6

Domanda semplice. Che aspetto avrebbe una conversione ugualmente funzionante in C#?Qual è l'equivalente C# di una dichiarazione get in VB6?

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 

Questo è stato il mio tentativo in C# (non restituisce risultati simili):

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

Si prega di leggere la documentazione del centro di assistenza sulla formattazione del codice: se si sta formattando un blocco di codice, si indenta piuttosto che usare i backtick ... sembra un * molto * più chiaro in questo modo. Dovresti anche provare a spiegare a persone che non conoscono VB6 cosa 'Get' fa ... altrimenti ti limiti alle persone che sanno C# * e * VB6 ... –

+3

@JohnSaunders: No, .NET usa UTF -8 di default - che sarà lo stesso di ASCII, per i file che contengono solo caratteri ASCII. –

+0

Questa è una mia vecchia domanda in cui stavo usando 'Put' invece di' Get', ma potrebbe aiutarti a seguire la strada giusta: http://stackoverflow.com/questions/8043167/how-to-read-and -write-interoperable-stringhe-a-un-binario-file-tra-net-e-vb –

risposta

5

In VB6, le stringhe vengono memorizzati come Unicode. In memoria, le stringhe VB6 memorizzano 4 byte di overhead, più 2 byte per carattere, quindi l'istruzione Dim rec As String * 200 alloca in realtà 4 + 200 * 2 byte di memoria, ovvero 404 byte. Poiché le stringhe VB6 e C# sono entrambe Unicode, non è necessario modificare nulla qui.

Il comando Get in VB6 recupera i byte da un file. Il formato è Get [#]filenumber, [byte position], variableName. Ciò recupererà comunque molti byte variableName, a partire da un offset di byte position. La posizione del byte è basata su 1 in VB6.

Così ora, per tradurre il vostro codice, dovrebbe essere simile a questo:

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

noti che SubString è 0-based e Mid è 1-based, quindi ho usato 6 invece di 7. Inoltre, l'offset nel metodo Read è basato su 0. Get è basato su 1 in VB6, quindi sottrarre uno.

+0

Grazie Bro! Questo ha risolto il problema, come ho detto che era una soluzione semplice che mi stava facendo impazzire. Quindi il vero offset di byte era in realtà "1000 x 200 = 200.000" quindi sì, hai inchiodato la mia domanda direttamente sulla testa. – BluishMicrobe