Alıntı (zafer):
> Yani aslında ID3v1 çalışmalarımızda kullandığımız 128 değeri gibi bir işlevi var
Aynen öyle. ID3v1'de sabit bir değerdi ID3v2'de ise her mp3'de farklı olabiliyor.
Alıntı:
> gerçi bizde o değeri sabit kullanmak yerine yapının boyutundan faydalanarak elde ediyorduk
Doğru. Aslında biraz kırılgan bir tasarım çünkü bir programcı bir üyenin türünü değiştirse herşey bozulur. Programa onun doğruluğunu garantileyen şöyle bir satır eklemek yararlı olabilir:
static assert(ID3v1Pakedi.sizeof == 128);
Bir dereceye kadar koruma sağlar.
Alıntı:
> ID3v2 için kullanılan alanın büyüklüğünü size değeri ile elde edeceğiz.
Evet. Protokollerde çok karşılaşılır. Örneğin IP paketlerinin (jargonuna daha uygun olarak "IP frame"lerinin) başlık bölümünün uzunluğu da öyle bir alanla bildirilir. Asıl verinin nerede başladığı o uzunluktan anlaşılır.
Alıntı:
> Benim anlam veremediğim (belki de sebebini bilmediğim için) neden böyle bir durum oluşmuş, yani neden size bilgisinden direk size değerini alamıyoruz da örnekte olduğu gibi uzunluk() gibi bir metod kullanmak zorunda kalıyoruz.
Ben de emin değilim ama belgenin başlık bölümüyle ilgili bölümünde "to avoid the introducuction [sic] of 'false syncsignals'" diyorlar. Senkronizasyon sinyalleri eklememek içinmiş. (?) Bildiğim bir konu değil ama neyse ki bir anlamı varmış. :)
Alıntı:
> Yoksa bu D'den kaynaklanan bir durum mu? Örneğin ben direk size diye okuduğum değeri neden kullanamıyorum ?
D ile ilgisi yok. ID3v2 standardı öyle olduğunu söylediği için. :) Biz de öyle okumak ve yazmak zorundayız:
Alıntı ("3.1. ID3v2 header"):
> The ID3v2 tag size is encoded with four bytes where the most significant bit (bit 7) is set to zero in every byte, making a total of 28 bits. The zeroed bits are ignored, so a 257 bytes long tag is represented as $00 00 02 01.
The ID3v2 tag size is the size of the complete tag after unsychronisation, including padding, excluding the header but not excluding the extended header (total tag size - 10). Only 28 bits (representing up to 256MB) are used in the size description to avoid the introducuction of 'false syncsignals'.
Etiket uzunluğu, en üst bitleri 0 olan dört bayt ile ifade ediliyormuş. Örnek olarak 257'nin nasıl ifade edildiğini göstermişler. Şimdi o değerin pakede nasıl yazılacağını düşünelim. Belki bu açıdan bakınca daha da iyi anlaşılır.
257 değeri ikili sistemde şudur: '0b100000001' Onaltılı sistemde de '0x101'. Yani normalde dört bayt olarak '0x00 0x00 0x01 0x01' biçiminde görmeyi bekleriz. Gerçek bilgi odur. Programlama dilimizin bir değişkenindeki 257 uzunluk değeri şu düzendedir (bu örnekte hiç etkileri olmadığı için üstteki iki baytı noktayla gösteriyorum):
'........ ........ yyyyyyyy zzzzzzzz'
257 değerinde 'yyyyyyyy' ve 'zzzzzzzz''nin ikisi de 0x01. Şimdi her baytın en üst bitini gözardı edilecek olan bir 0 yapmamız gerekiyor. Öyle yapınca en sağdaki baytın en soldaki z'sine yer kalmaz. Onun için bir üst bayta kaydırılır (Bunu da protokol söylüyor ama üstü kapalı olarak). Aynı şey y'ler için de geçerli. Sonuçta bellekteki değişken yukarıdaki gibi iken, paket içine şöyle yazılması gerekiyor:
'........ ......yy 0yyyyyyz 0zzzzzzz'
257'nin asıl ifadesinde y'lere karşılık gelen bayt 0x01'di. Yani en sağdaki biti 1'di. z'de de öyleydi. Şimdi o bitleri yerlerine yerleştirelim:
'........ ......00 .0000010 .0000001'
O dört baytın değerleri de şudur: '0x00 0x00 0x02 0x01'
İşte başlık bölümünün belgesindeki 257 örneğinde onun için "a 257 bytes long tag is represented as $00 00 02 01" diyorlar.
Ali
--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]