Как читать и записывать совместимые строки в двоичный файл между .NET и vb6 - PullRequest
7 голосов
/ 08 ноября 2011

У меня есть новая программа, которую я пишу на C #, она должна будет читать и записывать двоичные файлы, совместимые с двоичным форматом vb6.Я не могу изменить программу vb6, но могу внести изменения в свою программу.

У меня все работает, за исключением того, что я немного сомневаюсь в строках.

Если я напишу следующее в vb6

Private Type PatchRec
   string As String
End Type

Private Sub Command1_Click()
    Dim intFileNum As Integer
    Dim recTest As TestRec
    intFileNum = FreeFile
    Open "E:\testing" & "\" & "testfile" & ".bin" For Binary Access Write As #intFileNum
    recTest.string = "This is a test string"    
    Put #intFileNum, , recPatch
    Close #intFileNum
End Sub

И я пишу следующее на C #

public static void Main(params string[] args)
{
    using(var fs = new FileStream("test.bin", FileMode.Create, FileAccess.ReadWrite))
    using (var bw = new BinaryWriter(fs))
    {
        string str = "This is a test string";
        bw.Write(str);
    }
}

Я получаю эти две шестнадцатеричные строки

vb6 - 15 00 54 68 69 73 20 69 73 20 61 20 74 65 73 74 20 73 74 72 69 6E 67
c# -     15 54 68 69 73 20 69 73 20 61 20 74 65 73 74 20 73 74 72 69 6E 67

Кажется, что BinaryWriter не совпадает между двумя при записиstrings, vb6 использует двухбайтовую строку, а C # использует unsigned int в кодировке UTF-7.Также я не могу найти какой-либо ресурс, который использует кодировку VB, когда он записывает файл таким образом.

Существуют ли какие-либо встроенные инструменты для записи так же, как это делает vb6, и если нет, то кроме поворота длины вa uint16, есть ли другие ошибки, о которых мне нужно знать?

1 Ответ

9 голосов
/ 08 ноября 2011

Это просто короткое, содержащее длину строки, используйте BinaryWriter (короткое). Не используйте BinaryWriter.Write (string), используйте BinaryWriter.Write (byte []), где вы получили байт [] из Encoding.Default.GetBytes ().

Преднамеренное исключение функций сжатия в пространстве имен Microsoft.VisualBasic, возможно, не самый продуктивный подход. Это не байт, фреймворку все равно, какой язык вы используете. Посмотрите на Microsoft.VisualBasic.FileSystem.FilePut (). Доступный в любой версии .NET Framework, это код, который вам не нужно поддерживать, и он был проверен тысячами. Вы должны добавить ссылку на сборку в Microsoft.VisualBasic.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...