VB-BinaryWriter插入垃圾字符

时间:2018-09-18 13:03:55

标签: vb.net

我正在尝试在Visual Basic(2010)中创建MP3 ID3v1标签编辑器

我没有问题读取标签,但是,我似乎无法正确更新标签。

我使用FileStream打开文件,然后使用BinaryWriter。我想在“ TAG”标头之后找到,该标头距文件末尾125个字节。

第一个字段是标题字段,该字段长30个字符。

因此,在编写新标签之前,我将通过写入30个空格来清除它。

然后,我重新开始,并尝试写入新数据。但这最终会覆盖下一个字段中的数据。

        Dim file As New System.IO.FileStream(songpath, IO.FileMode.Open)
    Dim bw As New System.IO.StreamWriter(file)

    file.Seek(-125, IO.SeekOrigin.End)
    bw.Write("                             ")
    file.Seek(-125, IO.SeekOrigin.End)
    bw.Write(data(0))
    bw.Close()
    file.Close()

这是结果的屏幕截图。我试图在标题字段中写“ Test”,然后写数据,然后重新打开文件,这就是我得到的。

here is a screen cap of the program

1 个答案:

答案 0 :(得分:1)

我将像这样设置file.Seek属性,而不是使用.Position

Imports System.IO
Imports System.Text

Module Module1

    Sub Main()
        Dim f = "C:\temp\sample.MP3"

        Dim newTitle = "This is a test."
        Dim dataLen = 30
        Dim titleData(dataLen - 1) As Byte
        Dim newTitleBytes = Encoding.ASCII.GetBytes(newTitle)
        Array.Copy(newTitleBytes, titleData, Math.Min(dataLen, newTitleBytes.Length))

        Using str As New FileStream(f, FileMode.Open, FileAccess.Write, FileShare.None)
            Dim titlePosition = str.Length - 125
            str.Position = titlePosition
            str.Write(titleData, 0, dataLen)
        End Using

    End Sub

End Module

标题的未使用部分应该是值为零的字节-创建数组时,其值将为您* *。然后,您可以用代表ASCII字符串的字节填充标题字节的开头。我怀疑如果您需要带重音符号的字符,那么可以不使用ISO-8859-1,但是不要依赖于此。

Using的构造可确保即使出现问题也可以关闭文件。

*如果它是数字类型的数组,例如Byte或Integer等。