Thread overview
İkili kod sistemi(bit bit) yazma ?
Jan 23, 2011
cturan
Feb 26, 2012
Salih Dinçer
July 15, 2010

D ile dosya yazdığımda bit bit yazmak istiyorum. Örneğin 01010101 yazdığımda 8 bayt değil 8 bit yazmasını yer kaplamasını istiyorum. Sanırım bunun D ile alakası yok. Bunu nasıl yapabilirim ?

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

July 15, 2010

Teşekkür, sekizer bit değilde tek bit, iki bit gibi yapabilir miyim. Yani kaç bit olacağını ben seçebilir miyim ?

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

July 15, 2010

Teşekkürler. Bende şunu düşünüyordum. Diyelim a'nın değeri 0 olacak. Tek bite sığar. Ancak a'dan sonra gelecek karakterin a ile aynı olmadığını nasıl göstereceğiz ? Bu göstericinin her karakterden sonra yazılması gerektiğinden boyutu daha çok arttıracaktır. Bu yüzden 8 bit olarak gösterilmesi normal diye düşündüm.

Ancak şunu soracaktım. D'de ç'yi char olarak depoladığımızda iki bayttan oluşuyor. iki ayrı karakter yazacağına tek karakter yazması gerektiğini nasıl belirtiyor ? Biri ? işaretli oluyor ve onu karakter olarak saymayıp bir sonraki karakterin sayısal değerini o karakterin sayısal değerine mi ekliyor ? Ayrıca iki bayttan değilde Göktürk karakterleri gibi 4 bayttan oluşursa nasıl 4 karakter değilde tek karakter olarak düüşünüyor ?

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

July 15, 2010

Dosyayı binary ('b') olarak açmak gerekir. rawWrite ile ubyte yazarsak sekizer bit olarak yazılır. rawWrite ile int gibi başka türler de yazabiliriz.

import std.stdio;

void main()
{
   auto dosya = File("deneme.bin", "wb");

   ubyte[] veri = [ 0xaa, 0x0a, 0x55 ];
   dosya.rawWrite(veri);
}

Ali

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

July 15, 2010

Genel amaçlı araçlarla ve kütüphanelerle sekiz bitten daha düşük birim yok. Bellek bile öyle adreslenebildiği için ve eninde sonunda belleğe okunacağı için böylesi de uygun.

Eğer amaç sıkıştırma ise, yine de 8 biti birden yazıp okuyup ondan sonra onun parçalarını dilediğin gibi kullanabilirsin.

En küçük olarak ubyte kullanabildiğimiz halde bütün değerlerin 4 bite sığdıklarını biliyorsak, 8 bit içine 2 farklı değeri şöyle sıkıştırabiliriz:

import std.stdio;

ubyte sıkıştır(ubyte birinci, ubyte ikinci)
in
{
   // Değerleri dört bite sığmalı
   assert(birinci <= 0xf);
   assert(ikinci <= 0xf);
}
body
{
   return cast(ubyte)(birinci << 4) | ikinci;
}

void main()
{
   auto dosya = File("deneme.bin", "wb");

   ubyte[] veri = [ sıkıştır(1, 2), sıkıştır(3, 4) ];
   dosya.rawWrite(veri);
}

Ali

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

July 15, 2010

Alıntı (canalpay):

>

Diyelim a'nın değeri 0 olacak. Tek bite sığar. Ancak a'dan sonra gelecek karakterin a ile aynı olmadığını nasıl göstereceğiz ? Bu göstericinin her karakterden sonra yazılması gerektiğinden boyutu daha çok arttıracaktır. Bu yüzden 8 bit olarak gösterilmesi normal diye düşündüm.

Kodlama (encoding) konularından konuşmaya başladık. Bu da küçük bir bilim sayılır. :) Çok haklısın, okurken karışıklık olmayacak şekilde bir kodlama oluşturmamız gerekir.

Huffman kodlaması, en fazla kullanılan veri için özel bir şey yapmaz, diğerlerini bir şekilde işaretler:

http://en.wikipedia.org/wiki/Huffman_coding

UTF kodlamaları da ona çok benzer. Örneğin UTF-8 kodlaması, hangi baytın başlangıç baytı olduğunu, hangisinin izleyen bayt olduğunu ilk bitlerden anlar:

Şuradaki "Encoded bytes" sütununda görülüyor:

http://en.wikipedia.org/wiki/Utf-8#Description

İlk biti 0 olanlar, ASCII tablosuna denk geliyor.

İlk üç biti 110 olanlar, "iki baytlık Unicode karakterlerinin ilk baytı" oluyor. Ondan sonraki 10 bitle başlayanlar bunların devamı oluyor.

vs.

Alıntı:

>

D'de ç'yi char olarak depoladığımızda iki bayttan oluşuyor

Bellekte öyle.

Alıntı:

>

iki ayrı karakter yazacağına tek karakter yazması gerektiğini nasıl belirtiyor

O iş, o iki baytın UTF-8 olduğunu bilen ortama ait. Örneğin onu konsol biliyor.

Alıntı:

>

? Biri ? işaretli oluyor ve onu karakter olarak saymayıp bir sonraki karakterin sayısal değerini o karakterin sayısal değerine mi ekliyor ?

UTF kodlamalarındaki bayt değerlerinin Unicode değerleri ile doğrudan ilgileri yok. Bir şekilde bağlılar ama yukarıda belirttiğim üst bitler nedeniyle toplama işlemi olamaz.

Alıntı:

>

Ayrıca iki bayttan değilde Göktürk karakterleri gibi 4 bayttan oluşursa nasıl 4 karakter değilde tek karakter olarak düüşünüyor ?

O dört baytı değerlendiren ortam (örneğin konsol), ilk baytın 11110 bitleri ile başladığına bakarak elinde "dört bayt olarak kodlanmış bir Unicode karakteri" olduğunu anlıyor. (11110'ı yine yukarıdaki tablodan okuyorum.) Ondan sonra 3 bayt daha okuyor. O dört baytı "Binary" sütununda gösterildiği şekilde bir araya getirerek hangi Unicode karakteri olduğunu anlıyor.

Ondan sonra sıra fonta geliyor. Elindeki fontta o Unicode karakterinin şeklini buluyor ve konsola yazdırıyor.

Ali

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

July 15, 2010

Ek olarak, kodlamayı tersine çeviren decode işlevi şu modülde var:

dmd/src/phobos/std/utf.d

Ali

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

January 23, 2011

ilgimi en fazla çeken konulardan biri olan 00001101 konusuna giriş anahtarını bulduğum iyi oldu :) kitap çok güzel , site dahada güzel yapımda emeği geçen başta ali çehreli olmak üzere herkese teşekkür ediyorum

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

January 23, 2011

Teşekkürler, daha önceden hoşgeldin demeyi unuttuğum cturan! :)

Ali

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

February 26, 2012

Buradaki tartışma (ikilik sistem) hoşuma gitti, özellikle Huffman kodlama. Sıralanabilir nitelikteki verileri bağlı liste kullanarak işlemeye çalışıyorum. Huffman'nın sıkıştırma algoritmasını anladım ve tam yapacağım iş için uygun olduğunu düşünüyorum. Tabi çok karışık olduğu her halinden belli. Hazıra kaçacağım gibi her türlü bedavacılık kabül edilir...:)
Alıntı (Öncekiye Ekleme):

>

Bu konuyu şurada tartışmaya ve aşama kaydetmeye başladık: http://ddili.org/forum/thread/734

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]