VBA 1 лишний байт при записи в бинарный файл

Рейтинг: 0Ответов: 2Опубликовано: 25.05.2023

При использовании оператора Put возникает странная ситуация - размер записываемого в файл массива 10 байт, однако в конец файла всегда добавляется 1 нулевой байт. Как это исправить?

Dim arr(10) As Byte
Open strFilePath For Binary Lock Write As #1
Put #1, , arr
Close #1

Ответы

▲ 3Принят

Никаких лишних нулей Put не пишет. Здесь дело в Option Base 0 по умолчанию см. здесь.
Если явно не указать нижнюю границу массива Dim arr(10) As Byte при Option Base 0 (по умолчанию), то объявится массив от 0 до 10, т.е. из 11 элементов.
Чтобы задать 10 элементов при верхней границе 10, явно определите Option Base 1 или укажите нижнюю и верхнюю границы при объявлении массива Dim arr(1 To 10) As Byte.
Ну или Dim arr(9) As Byte - будет также 10 байт от 0 до 9.

Option Base 1

Sub test1()
    strFilePath = "c:\test\binary.bin"

    Dim arr(1 To 10) As Byte
    Dim f, i

    For i = LBound(arr) To UBound(arr)
        arr(i) = i
    Next
    
    f = FreeFile
    Open strFilePath For Binary Lock Write As f
    Put f, , arr
    Close f
End Sub

Файл:
введите сюда описание изображения

Примечание. Для нахождения свободного номера файла можно использовать функцию FreeFile

▲ 1

Проблема, которую вы описываете, связана с тем, что оператор Put в Visual Basic добавляет нулевой байт в конец файла при записи массива, чтобы обозначить его конец. Это поведение по умолчанию для оператора Put в режиме бинарной записи.

Если вы хотите избежать добавления нулевого байта в конец файла, вам нужно использовать другие методы записи, такие как использование функций FilePut или PutObject. Ниже приведен пример использования функции FilePut для записи массива байтов без добавления нулевого байта в конец файла:

Dim arr(10) As Byte
Open strFilePath For Binary Lock Write As #1
FilePut(1, arr)
Close #1

При использовании FilePut нулевой байт не будет добавлен в конец файла, и файл будет содержать только указанные вами 10 байт.