【问题标题】:ID3v2 tag issue with APIC in C#/.NETC#/.NET 中 APIC 的 ID3v2 标记问题
【发布时间】:2017-12-19 08:14:30
【问题描述】:

我正在编写自己的 ID3v2 标签阅读器,但我似乎遇到了 APIC 标签的问题。每当它读取它时,它会说它是 2,038,335 字节,而实际上它是 511,281 字节大。我不知道为什么,我觉得这与这条线有关:

int size = ( data[ i ] << 24 ) | ( data[ ++i ] << 16 ) | ( data[ ++i ] << 8 ) | ( data[ ++i ] << 0 ) - 1;

但是这条线适用于我测试过的所有其他标签。也可能是我在 ID3v2 标签标准中遗漏了一些东西,或者完全是其他东西。这是用于存储图像以供以后使用的代码:

List<byte> temp = new List<byte>();

            for( int i = 1; i < frame.Length; i++ ) {
                if(frame[i] == 0x00 ) {
                    break;
                } else {
                    temp.Add( frame[ i ] );
                }
            }

            string strVer = Encoding.Default.GetString( temp.ToArray() );

            if ( strVer.StartsWith( "image/" ) ) {
                List<byte> image = new List<byte>();

                for(int i = temp.Count + 1 + frame[ temp.Count + 2 ]; i < frame.Length; i++ ) {
                    image.Add( frame[ i ] );
                }

                tagInfo[ tag ] = image.ToArray();
            }

            tagInfo[ tag ] = frame;

我用于测试的文件是带有 2000x2000 像素图像的“Resistence by Aero Chord”。

这是一个产生相同大小的脚本:

using System;
using System.IO;
using System.Text;
using System.Threading;

class Program {
    static void Main( string[] args ) {
        int tagSize = 0;

        byte[] fileData = byte[] fileData = { 0x41, 0x50, 0x49, 0x43, 0x00, 0x1f, 0x1a, 0x3f };

        for ( int i = 0; i < fileData.Length - 3; i++ ) {
            string tag = Encoding.Default.GetString( new byte[] { fileData[ i ], fileData[ i + 1 ], fileData[ i + 2 ], fileData[ i + 3 ] } );

            if ( tag.Equals( "APIC" ) ) {
                i += 4;

                tagSize = ( fileData[ i ] << 24 ) | ( fileData[ ++i ] << 16 ) | ( fileData[ ++i ] << 8 ) | ( fileData[ ++i ] << 0 ) - 1;
                break;
            }
        }

        Console.Write( $"Tag stated size: {tagSize} bytes." );

        Thread.Sleep( 60000 );
    }
}

预计:511,281 字节

结果:2,038,334 字节

使用嵌入到文件中的图像和文件中的 APIC 标记。

【问题讨论】:

  • 欢迎来到 Stack Overflow。请阅读tourHow to Ask;您的问题应包含重现您的问题所需的所有代码和输入,即minimal reproducible example
  • @CodeCaster 我的编辑更好吗?我刚开始在这个网站上提问,而且我不太擅长与人互动。
  • 是的,这更好,但如果您认为问题出在该行,请显示重现该问题的minimal reproducible example(在 Visual Studio 或 ideoneor dotnetfiddle 上启动一个新项目),包括输入、预期输出和实际输出。
  • @CodeCaster 我已经根据我的理解添加了 Minimal、Complete 和 Verifiable。这有帮助吗?
  • 快到了。如果你认为APIC标签有问题,那么保存fileData的相关字节值并在内存中构造一个数组,这样我们就不用下载任何文件了。

标签: c# .net id3v2


【解决方案1】:

来自standard

ID3 标签大小用四个字节编码,其中每个字节的第一位(第 7 位)设置为零,总共 28 位。零位被忽略,因此一个 257 字节长的标签表示为 $00 00 02 01

您的字节值大小为八位,但您需要最后七位,删除始终为零值的第一位。

所以:

tagSize = (tagSize[i] << 21) | (tagSize[++i] << 14) | (tagSize[++i] << 7) | (tagSize[++i] << 0);

对于0x00, 0x1f, 0x1a, 0x3f 的输入,这将产生511295 的大小。

【讨论】:

  • 哇,谢谢,你在哪里发现似乎比这个网站更好地解释它:id3.org/id3v2.4.0-structure
  • 是的,我也找到了那个网站,但是他们的标题 “观众被告知” 并没有真正被该文档所证实。
  • 它似乎不喜欢我的主 dll,但是,我确实进行了一些修改以使其正常工作。我所做的只是检查标签是否是 APIC 标签,如果是则减去 11,否则减去 1。
猜你喜欢
  • 1970-01-01
  • 2011-06-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多