TAG_ID3(来自 Bass 2.4.4)无法正常工作

TAG_ID3 (from Bass 2.4.4) doesn't work properly

我正在尝试使用 "BASS.dll"(通过 bass.lib 和 bass.h)从 mp3 文件中读取 ID3v1 标签。
在 .mp3 文件的标题(或艺术家)有 30 个字符之前它工作正常。
相反 Happy Times (Feat. Margaux Bos 我得到 Happy Times (Feat. Margaux BosEmigrate
添加了 Emigrate (这是艺术家标签)。

如何在不添加艺术家标签的情况下使其正常工作?
这是我的源代码:

//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
#include "Unit2.h"
#include "bass.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm2 *Form2;

//---------------------------------------------------------------------------
__fastcall TForm2::TForm2(TComponent* Owner)
    : TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm2::Button1Click(TObject *Sender)
{
    BASS_Init(-1, 44000, 0, 0, 0);

    if(OpenDialog1->Execute())
    {
       HSTREAM stream = BASS_StreamCreateFile(false, OpenDialog1->FileName.c_str(), 0, 0, 0);
       TAG_ID3 *tags = (TAG_ID3*)BASS_ChannelGetTags(stream, BASS_TAG_ID3);
       Edit1->Text = tags->title;
    }
}

不保证 TAG_ID3 结构的文本字段以空终止符结尾,但您的代码将它们视为它们,因此当空终止符不是空终止符时,它最终会读入下一个字段当前的。要解决这个问题,您必须考虑它们的最大长度,例如:

Edit1->Text = AnsiString().sprintf("%.*s", sizeof(tags->title), tags->title);

或者:

Edit1->Text = AnsiString(tags->title, sizeof(tags->title)).TrimRight();

与所有其他文本字段相同:

  • id: 3 个字符
  • title: 30 个字符
  • artist: 30 个字符
  • album: 30 个字符
  • year: 4 个字符
  • comment: 30 个字符

您可以使用一个简单的模板包装器来帮助您:

template<size_t N>
String toString(char (&arr)[N])
{
    return AnsiString().sprintf("%.*s", N, arr); 
    /* or:
    return AnsiString(arr, N).TrimRight();
    */
}

Edit1->Text = toString(tags->title);

请注意,comment 字段还有一个额外注意事项:

If the 30th character is non-null whilst the 29th character is null, then the 30th character is the track number and the comment is limited to the first 28 characters.