Forum: Ders Arası RSS
İkili kod sistemi(bit bit) yazma ?
canalpay (Moderatör) #1
Kullanıcı başlığı: Can Alpay Çiftçi
Üye Tem 2009 tarihinden beri · 1133 mesaj · Konum: İzmir
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
Konu adı: İkili kod sistemi(bit bit) yazma ?
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 ?
acehreli (Moderatör) #2
Kullanıcı başlığı: Ali Çehreli
Üye Haz 2009 tarihinden beri · 4527 mesaj
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
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
canalpay (Moderatör) #3
Kullanıcı başlığı: Can Alpay Çiftçi
Üye Tem 2009 tarihinden beri · 1133 mesaj · Konum: İzmir
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
Teşekkür, sekizer bit değilde tek bit, iki bit gibi yapabilir miyim. Yani kaç bit olacağını ben seçebilir miyim ?
acehreli (Moderatör) #4
Kullanıcı başlığı: Ali Çehreli
Üye Haz 2009 tarihinden beri · 4527 mesaj
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
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
canalpay (Moderatör) #5
Kullanıcı başlığı: Can Alpay Çiftçi
Üye Tem 2009 tarihinden beri · 1133 mesaj · Konum: İzmir
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
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 ?
acehreli (Moderatör) #6
Kullanıcı başlığı: Ali Çehreli
Üye Haz 2009 tarihinden beri · 4527 mesaj
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
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.

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

Bellekte öyle.

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.

? 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.

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
acehreli (Moderatör) #7
Kullanıcı başlığı: Ali Çehreli
Üye Haz 2009 tarihinden beri · 4527 mesaj
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
Ek olarak, kodlamayı tersine çeviren decode işlevi şu modülde var:

  dmd/src/phobos/std/utf.d

Ali
cturan #8
Üye Ara 2010 tarihinden beri · 15 mesaj · Konum: van
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Konu adı: güzel bilgi
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
acehreli (Moderatör) #9
Kullanıcı başlığı: Ali Çehreli
Üye Haz 2009 tarihinden beri · 4527 mesaj
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
Teşekkürler, daha önceden hoşgeldin demeyi unuttuğum cturan! :)

Ali
Avatar
Salih Dinçer #10
Üye Ock 2012 tarihinden beri · 1912 mesaj · Konum: İstanbul
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
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...:)
Öncekiye Ekleme:
Bu konuyu şurada tartışmaya ve aşama kaydetmeye başladık: http://ddili.org/forum/thread/734
Bilgi paylaştıkça bir bakmışız; kar topu olmuş ve çığ gibi üzerimize geliyor...:)
Bu mesaj Salih Dinçer tarafından değiştirildi; zaman: 2012-02-26, 08:53.
Doğrulama Kodu: VeriCode Lütfen resimde gördüğünüz doğrulama kodunu girin:
İfadeler: :-) ;-) :-D :-p :blush: :cool: :rolleyes: :huh: :-/ <_< :-( :'( :#: :scared: 8-( :nuts: :-O
Özel Karakterler:
Forum: Ders Arası RSS
Bağlı değilsiniz. · Şifremi unuttum · ÜYELİK
This board is powered by the Unclassified NewsBoard software, 20100516-dev, © 2003-10 by Yves Goergen
Şu an: 2017-11-22, 06:48:46 (UTC -08:00)