İkilik Verinin Kodlanması
Önceki V. Oylum - Diziler ve Dizgeler Sonraki
İkilik Verinin Kodlanması
Sadece metin türü verilerin saklanabildiği ya da aktarılabildiği ortamlarda saklama ya da aktarma öncesi ikilik verinin baytlarının karakterlere dönüştürülmesi gerekir. SVID sistemleri (ve günümüzde XPG uyumlu sistemler) bu işlem için çok az destek sağlar.
char *l64a
(long int n)
işlev
Bu işlev, temel karakter kümesindeki karakterleri kullanarak 32 bitlik girdiyi kodlar. İşlev n sayısının kodlanmış halini içeren 7 karakterlik bir tampona gösterici ile döner. Yazılımcı bir sayı dizisini kodlamak istiyorsa, ikinci bir tampona dönen veriyi kopyalamalıdır. n sıfırsa boş dizge döner, biraz tuhaf ama standart böyle.
Uyarı
Tamponu durağan olduğundan işlev çok evreli yazılımlarda kullanılmamalıdır. Bu işlevin evreli yazılımlarca kullanılabilecek bir eşdeğeri C kütüphanesinde yoktur.
Uyumluluk Bilgisi
XPG standardında negatif n değerleri için l64a işlevinin dönüş değeri anlamlı değildir. GNU gerçeklemesinde, işlev argümanını işaretsiz olarak ele alır, böylece sıfırdan farklı n değerleri negatif olsalar bile anlamlı bir değer döner. Taşınabilir yazılımlar geliştiriyorsanız bu durumu dikkate almalısınız.
Büyük bir tamponu kodlamak isterseniz, her seferinde 32 bitlik bir tamponu dönüştürecek şekilde bir döngü kullanmalısınız. Örnek:
char *
encode (const void *buf, size_t len)
{
  /* Ne kadar uzunlukta bir tampon gerektiğini biliyoruz */
  unsigned char *in = (unsigned char *) buf;
  char *out = malloc (6 + ((len + 3) / 4) * 6 + 1);
  char *cp = out, *p;

  /* Uzunluğu kodlayalım. */
  /* `htonl' kullanarak farklı bayt sıralaması kullanan makinelerde
      bile doğru çözümleme yapılmasını garanti edelim.
      `l64a' b bayttan daha kısa bir dizge döndürebilir,
      bu durumda genişliği tamamlamak için boşluğu 0
      karakterleriyle dolduralım.  */

  p = stpcpy (cp, l64a (htonl (len)));
  cp = mempcpy (p, "......", 6 - (p - cp));

  while (len > 3)
    {
      unsigned long int n = *in++;
      n = (n << 8) | *in++;
      n = (n << 8) | *in++;
      n = (n << 8) | *in++;
      len -= 4;
      p = stpcpy (cp, l64a (htonl (n)));
      cp = mempcpy (p, "......", 6 - (p - cp));
    }
  if (len > 0)
    {
      unsigned long int n = *in++;
      if (--len > 0)
        {
          n = (n << 8) | *in++;
          if (--len > 0)
            n = (n << 8) | *in;
        }
      cp = stpcpy (cp, l64a (htonl (n)));
    }
  *cp = '\0';
  return out;
}
Kütüphanenin gereken tam işlevselliği sağlamaması garip ama elden ne gelir.
l64a ile kodlanmış veri aşağıdaki işlev kullanılarak eski haline getirilebilir.
long int a64l
(const char *dizge)
işlev
dizge parametresi, l64a çağrısı ile elde edilmiş en az 6 karakterlik bir dizge olmalıdır. İşlev karakterleri aşağıdaki tabloya göre çözümler. Tabloda bulunmayan bir karaktere rastlanırsa işlev, atoi işlevinin tersine çözümlemeyi durdurur. Satırlara ayrılmış bir tampon kullanıyorsanız, satırsonu karakterlerine dikkat etmelisiniz.
Kodu çözülen sayı bir long int değer olarak döndürülür.
l64a ve a64l işlevleri base 64 kodlaması kullanır. Yani bir kodlanmış dizgenin her karakteri bir girdi sözcüğünün (16 bitlik alan) altı biti ile ifade edilir. Base 64 sayılar için kullanılan semboller:
 012 3 4 567
0./012345
86789ABCD
16EFGHIJKL
24MNOPQRST
32UVWXYZab
40cdefghij
48klmnopqr
56stuvwxyz
Bı kodlama şeması standart değildir. Daha geniş çapta kullanılan başka kodlama yöntemleri de (UU kodlaması, MIME kodlaması gibi) vardır. Genelde bu kodlamalardan birini kullanmak daha iyidir.
Önceki Üst Ana Başlık Sonraki
Bayağı Şifreleme Başlangıç Argz ve Envz Vektörleri
Bir Linux Kitaplığı Sayfası