使用Visual Basic

时间:2015-08-07 03:20:23

标签: vb.net id3 audio-player

将音乐从iPod传输到计算机上时,文件名采用“加密”字样。形成。我正在制作一个Visual Basic程序来浏览我复制到桌面上的音乐文件夹,并根据"标题"重命名曲目。从文件的细节。当我运行mp3文件的代码时,它完美地运行。但是,当我在m4a文件上运行时,我的代码的这一部分会出错。

Dim TitleFrame As String = "TIT2"
        Dim foundFrame As String = ""
        Dim index As Integer = -1
        Do
            index += 1
            foundFrame = Chr(Data(index)) & Chr(Data(index + 1)) &      Chr(Data(index + 2)) & Chr(Data(index + 3))
        Loop Until foundFrame = TitleFrame

给出的错误是它表示数组超出范围,指的是以foundFrame = chr...开头的行。我假设这是因为此m4a文件类型的标题框架标识符与TIT2不同。

请帮我匹配框架类型或者给我一个程序化的方法,不知道我正在寻找但仍然找到标题信息的框架类型。最好不要下载任何东西。

1 个答案:

答案 0 :(得分:0)

如果它具有不同的帧标识符,请将Loop Until语句更改为:

Loop Until foundFrame = TitleFrame Or index = String(Data).Length - TitleFrame.Length

或者,只有在数据包含字符串时才执行循环,如下所示:

If String(Data).Contains(TitleFrame) Then
    ' Loop through
End If

或者,为了加快速度,你可以取消循环,并使用它,如果数据包含Boolean,则给出TIT2值:

String(Data).Contains(TitleFrame)

这应该可以阻止例外。

以下是技术原因:

假设我的数据等于此SHA-256十六进制哈希的字符串到文本Stack Overflow

185A76793EFF17B079F576328881972DABABED51764F1AB5AFED4C9ACEF64D55

请注意该字符串是如何包含TIT2的。 If语句应该立即捕获它,而不是查找TIT2

但是,我还想解释我对循环的更改。您会再次注意到,此字符串不包含TIT2。执行将是这样的:

index ............. foundFrame
0 ................. 185A
1 ................. 85A7
2 ................. 5A76
... skipping through ...
59 ................ 64D5
60 ................ 4D55

结尾字符的索引是:

6  4  D  5  5
59 60 61 62 63

我们的长度与TitleFrame.Length 4相同。index。当59foundFrame时,64D5应为59,索引606162.和{{1} }

如果它是60,它会foundFrame 4D55,索引606162和{{ 1}}。

这是循环应该结束的地方,以避免越界异常。如果我们在63尝试index,我们会得到6161626364不存在且程序崩溃。

我可以使用64,但我想使用String(Data).Length - 4,以防您希望将TitleFrame.Length修改为TitleFrame以外的其他内容。< / p>