0

最初に理由の説明:

さまざまな MP3 リンクへのリンクのリストがあり、これらのファイルの ID3 情報をすばやく読み取ろうとしています。最初の 1500 バイト程度しかダウンロードせず、このチャンク内のデータを分析しようとしています。ID3Lib に出くわしましたが、完全にダウンロードされたファイルでしか動作せず、Streams のサポートに気付きませんでした。(これで間違っていたら遠慮なく指摘してください)

したがって、基本的には、ID3 タグを自分で解析しようとすることになります。タグのサイズは、ファイルの先頭付近の 4 バイトから判断できます。ID3 サイトから:

ID3v2 タグのサイズは 4 バイトでエンコードされ、すべてのバイトで最上位ビット (ビット 7) がゼロに設定され、合計 28 ビットになります。ゼロになったビットは無視されるため、257 バイトの長さのタグは $00 00 02 01 として表されます。

だから基本的に:

00000000 00000000 00000010 00000001

になる

0000 00000000 00000001 00000001

私はビットレベルの操作にあまり慣れていないので、誰かがこれらの 4 バイトのそれぞれの左端のビットを無視するエレガントなソリューションについて洞察を得ることができるかどうか疑問に思っていましたか? そこから基数 10 の整数を取得しようとしているので、それも機能します。

4

2 に答える 2

4

4 つの個別のバイトがある場合は、次のようにします。

int value = ((byte1 & 0x7f) << 21) |
            ((byte2 & 0x7f) << 14) |
            ((byte3 & 0x7f) << 7) |
            ((byte4 & 0x7f) << 0);

すでにシングルで入手している場合int

int value = ((value & 0x7f000000) >> 3) |
            ((value & 0x7f0000) >> 2) |
            ((value & 0x7f00) >> 1) |
            (value & 0x7f);
于 2011-04-15T07:20:12.920 に答える
0

最上位ビットをクリアするには、AND と 127 (0x7F) を使用すると、MSB から離れたすべてのビットが取得されます。

int tag1 = tag1Byte & 0x7F;  // this is the first one read from the file
int tag2 = tag2Byte & 0x7F;
int tag3 = tag3Byte & 0x7F;
int tag4 = tag4Byte & 0x7F;  // this is the last one

これを単一の数値に変換するには、各タグ値が 128 進数であることを認識してください。したがって、最下位は 128^0 (1)、次は 128^1 (128)、3 番目は (128^2) などで乗算されます。

int tagLength = tag4+(tag3<<7)+(tag2<<14)+(tag1<<21)

これを基数 10 に変換したいと言いました。次に、int から文字列への変換を使用して、たとえば印刷用にこれを基数 10 に変換できます。

String base10 = String.valueOf(tagLength);
于 2011-04-15T07:20:05.307 に答える