number.length'in türü size_t, i'nin türü int olduğu için toDecimal() içinde derleme hatası alınca i'yi size_t olarak değiştirdim.
Ama o zaman da number.length sıfır olduğunda number.length-1'in çok büyük bir değer olma tehlikesi var. Üstelik size_t türündeki bir değer zaten hep >=0 olur:
Ben de daha kolay olduğu için foreach kullandım ama azalan yöndeki sayı aralıklarında onun da sorunu oluyor çünkü (number.length-1)..0 yazınca bu sefer de 0 aralığa dahil olmuyor.
Şu çalıştı:
ubyte toDecimal(string number)
in
{
assert(number.length != 0);
}
body
{
ubyte result;
foreach (i; 0 .. number.length) {
if (number[i] == '1') {
result += 2 ^^ (number.length - 1 - i);
}
}
return result;
}
Dosya boyuyla ilgili olarak: Tamam, artık '1' ve '0' karakterleri yazmıyorsun ama değerleri yine de metin halinde yazıyorsun. Örneğin 245 değerini dosyaya o değerdeki tek bayt olarak değil; '2', '4', ve '5' karakterleri olarak yazıyorsun. writef() ile formatlı olarak değil, rawWrite() ile çiğ olarak yazabilirsin:
compressedFile_.rawWrite([ toDecimal(compressedText[0 .. 8]) ]);
Şimdi dosyanın boyu örneğin 15 yerine 5 oluyor.
Ali
--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]