Есть двоичный файл. Его нужно открыть, прочитать четыре байта по заданному смещению и заменить их на другие четыре байта, указанные пользователем. Эти четыре байта представляют собой строку. Для этого я написал такой класс:
- Код: Выделить всё
Private Class FourCc
Private m_Offset As Integer
Private m_Len As Integer
Friend Property Offset() As Integer
Get
Return m_Offset
End Get
Set(ByVal value As Integer)
m_Offset = value
End Set
End Property
Friend Property Lenght() As Integer
Get
Return m_Len
End Get
Set(ByVal value As Integer)
m_Len = value
End Set
End Property
''' <summary>
''' Функция читает значение FourCC из заданного файла
''' </summary>
''' <param name="FileName">Имя файла</param>
''' <returns>Строку, содержащую описание кодека</returns>
''' <remarks></remarks>
Friend Function ReadFourCC(ByVal FileName As String) As String
Dim retval As String = ""
Dim binReader As BinaryReader = Nothing
Try
binReader = New BinaryReader(File.OpenRead(FileName))
binReader.BaseStream.Seek(m_Offset, SeekOrigin.Begin)
retval = CStr(binReader.ReadChars(m_Len))
Catch ex As ArgumentNullException
Throw New Exception("Путь к файлу не указан.")
Catch ex As ArgumentException
Throw New Exception("Неверный путь.")
Catch ex As PathTooLongException
Throw New Exception("Слишком длинный путь к файлу.")
Catch ex As DirectoryNotFoundException
Throw New Exception("Каталог не найден.")
Catch ex As UnauthorizedAccessException
Throw New Exception("Ошибка прав доступа.")
Catch ex As FileNotFoundException
Throw New Exception("Файл не найден.")
Catch ex As IOException
Throw New Exception("Ошибка чтения.")
Catch ex As Exception
Throw New Exception("Ошибка чтения описания кодека")
Finally
binReader.Close()
End Try
Return retval
End Function
''' <summary>
''' Записывает в файл новое значение FourCC
''' </summary>
''' <param name="FileName">Путь к файлу</param>
''' <param name="NewFourCC">Новое значение</param>
''' <remarks></remarks>
Friend Sub ReplaceFourCc(ByVal FileName As String, ByVal NewFourCC As String)
Dim binWriter As BinaryWriter = Nothing
Try
binWriter = New BinaryWriter(File.OpenWrite(FileName))
binWriter.BaseStream.Seek(m_Offset, SeekOrigin.Begin)
binWriter.Write(NewFourCC.ToCharArray, 0, m_Len)
Catch ex As ArgumentException
Throw New Exception("Неверный путь.")
Catch ex As PathTooLongException
Throw New Exception("Слишком длинный путь к файлу.")
Catch ex As DirectoryNotFoundException
Throw New Exception("Каталог не найден.")
Catch ex As UnauthorizedAccessException
Throw New Exception("Ошибка прав доступа.")
Catch ex As FileNotFoundException
Throw New Exception("Файл не найден.")
Catch ex As NotSupportedException
Throw New Exception("Неверный формат пути.")
Catch ex As Exception
Throw New Exception("Неизвестная ошибка. " & ex.Message)
Finally
binWriter.Close()
End Try
End Sub
End Class
Всё довольно просто. Но! Этот вариант я нашёл после двух часов попыток писать строку или читать строку. Сейчас, как видно, я пишу и читаю массив символов.
А произошло это потому, что при попытке прочитать строку, первый символ обрезался. Я даже уменьшал смещение на 1, чтобы прочитать всё. А при попытке записать строку перед ней писался ещё и пробел. Т.е. я пытаюсь записать 4 байта, а пишется пять и первый из них пустой.
Вот и вопрос: почему так?
Желающим попробовать нужно заменить
- Код: Выделить всё
retval = CStr(binReader.ReadChars(m_Len))
на
- Код: Выделить всё
retval = binReader.ReadString.SubString(0, m_Len)
в процедуре чтения и
- Код: Выделить всё
binWriter.Write(NewFourCC.ToCharArray, 0, m_Len)
на
- Код: Выделить всё
binWriter.Write(NewFourCC)
для процедуры записи и результатами полюбоваться в любом hex-редакторе