LINUX.ORG.RU

кодирование бинарных данных


0

0

Подскажите простейший способ (и реализацию на C/C++) для кодирования/декодирования бинарного потока в поток, в кгтором присутствует меньший набор символов (так как это делает uue) ?

anonymous

Про способ: UU encoding, base64 encoding.
Про реализацию: не поверишь -- исходники uuencode :))

asd
()

А base64 даже в каком-то RFC описан.

Havoc ★★★★
()

Если действительно совсем-совсем простейший то каждый байт бинарного потока можно кодировать в две шестнадцатеричные цифры.

anonymous
()

Если действительно совсем-совсем простейший то каждый байт бинарного потока можно кодировать в две шестнадцатеричные цифры.

anonymous
()

Может, пригодится, не совсем то, что требуется, но идею понять легко.


Кодирует/декодирует long int  в четырехбуквенную последовательность.
encode переводит число в систему счисления по базе base и добавляет к
каждой полученной цифре пробел. Чтобы уложиться в ASCII диапазон 
(32 -- 127) base должна быть не более 127-32 = 95
Максимальное long число, что может быть закодировано, при этом
94+94*95+94*95^2+94*95^3=81450624 (мне бОльших чисел не требовалось) < 2^32

Тривиально обобщается на 5 букв, тогда макс. число будет
94+94*95+94*95^2+94*95^3+94*95^4 = 7737809374 > 2^32

char *encode(long val, char *buf, int base)
{           
  long a,b,c,d;
     d=base*base;/*base^2*/
     c=d*base;/*base^3*/
     a=val/c;/*val / base^3 */
     b=(c=(val % c))/d;/* (val % base ^3 ) / base ^2 */
     c=(d=(c % d))/base; /*(val % base^3 % base^2) / base */
     d=d % base; /* val % base^3 % base^2 % base */
     buf[0]=a+' ';buf[1]=b+' '; buf[2]=c+' ';buf[3]=d+' ';buf[4]=0;
     return(buf);
}/*encode*/ 
            
long decode(char *buf, int base)
{           
register  long tmp=0, pw=1;
register  int i;
     for(i=3;!(i<0);i--){
        tmp+=(buf[i]-' ')*pw;
        pw*=base;
     }      
     return(tmp);
}/*decode*/

Die-Hard ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.