2017-12-19 4 views
0

저는 독자적인 ID3v2 태그 리더를 작성하고 있지만 APIC 태그에 문제가있는 것 같습니다. 읽었을 때마다 실제로는 511,281 바이트가 크면 2,038,335 바이트가됩니다. 나는 이유에 아무 생각이없고, 나는이 줄을 함께 할 수있는 뭔가의 느낌이 있습니다ID3v2 C#에서 APIC와 태그 문제가 발생했습니다./

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 픽셀 이미지와 '에어로 코드에 의해 대한 저항 "입니다 : 여기에 나중에 이미지를 저장하기위한 것입니다 코드의 조각이다. 예상

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); 
    } 
} 

: 2,038,334 바이트

파일과 APIC 태그에서에 포함 된 이미지를 사용 : 결과가

511,281 바이트 여기

는 같은 크기를 생성하는 스크립트입니다 파일. standard 가입일

+0

스택 오버플로에 오신 것을 환영합니다. [둘러보기]와 [질문]을 읽으십시오. 질문에 문제를 재현하는 데 필요한 모든 코드와 입력이 있어야합니다 (예 : [mcve]). – CodeCaster

+0

@CodeCaster 제 편집이 더 좋습니까? 나는이 사이트에 대해 묻는 것에 익숙하지 않으며 나는 인간 상호 작용에 그다지 좋지 않습니다. – TechNGamer

+0

네, 그게 더 낫지 만 문제가 그 줄에 있다고 생각한다면 입력, 예상 출력 및 실제 출력을 포함하여 문제를 재현하는 [mcve] (Visual Studio 또는 ideoneor dotnetfiddle에서 새 프로젝트 시작)를 보여주십시오. . – CodeCaster

답변

0

:

ID3 태그의 크기는 28 비트의 합계를 만들기 첫 번째 비트 (비트 7) 모든 바이트 0으로 설정되어 4 바이트로 부호화된다. 제로화 된 비트는 무시되므로 길이가 257 바이트 인 태그는 $ 00로 표시됩니다. 00 02 01

바이트 값은 8 비트이지만 마지막 7 비트가 필요합니다. 첫 번째 비트는 항상 0 값을 갖는다.

그래서 :

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

0x00, 0x1f, 0x1a, 0x3f의 입력 511295의 크기를 얻을 것입니다.

+0

와우, 고마워, 어디에서 본 사이트보다 더 잘 설명하는 것으로 나타났습니다 : http://id3.org/id3v2.4.0-structure – TechNGamer

+0

그래, 그 사이트도 발견했지만 그들의 제목은 _ "The Audience "_ 그 문서에 의해 사실로 밝혀지지는 않았습니다. – CodeCaster

+0

그것은 내 주요 dll을 좋아하지 않는 것 같지만, 제대로 작동하려면 약간의 해킹을했습니다. 내가 한 것은 태그가 APIC 태그인지 확인하여 11을 뺍니다. 그렇지 않으면 1을 뺍니다. – TechNGamer