nixp.ru v3.0

23 октября 2017,
понедельник,
18:05:16 MSK

DevOps с компанией «Флант»
Аватар пользователя Steck
Steck написал 16 мая 2006 года в 08:58 (315 просмотров) Ведет себя как мужчина; открыл 124 темы в форуме, оставил 549 комментариев на сайте.

Есть код

#include
#include
#include
char *decode(char *src, int len)
{
            char *Out=NULL;
            int i;
            Out = (char*) malloc (len/4+1 );
            for(i=0; i < len/2; i++)
            {
                        printf("%s\n",&src[2*i]);
                        sscanf(&src[2*i],"%02X",&Out[i]);
            }
            return Out;
}
char *charset_encode(unsigned char *src, char *toCODE, char *fromCODE)
{
            static iconv_t cd;
char  *to=NULL;
unsigned short nLen = strlen(src) *2;
char *to_p = (char *)malloc(nLen + 1);
to = to_p;
unsigned char *OutStr="";
size_t InSize=0,OutSize=0;
int i;
cd = iconv_open(toCODE,fromCODE);
if(cd == (iconv_t)-1){
            printf("iconv()\n");
exit(0);
}
InSize = strlen(src);
OutSize = nLen;
if(iconv(cd,(const char **)&src,&InSize,&to,&OutSize)==(size_t)-1)
{
            printf("iconv()\n");
exit(0);
}
iconv_close(cd);
for(i = 0; i < nLen - OutSize ; i++)
                        {
                                    OutStr=g_strdup_printf("%s%c",OutStr,to_p[i]);
                        }
                        return OutStr;
}
int main(int argc, char *argv[])
{
            printf("%s\n",charset_encode(
                                                decode(argv[1],strlen(argv[1])),
                                                "KOI8-R","UCS-2"));
}

Собрираю прогу и передаю ей параметр строки

[steck(~)]$ gcc `pkg-config --cflags --libs gtk+-2.0` -liconv -I/usr/local/include/ -L/usr/local/lib conv.c -o conv
[steck(~)]$ ./conv 044F0445044A044900200044F
044F0445044A044900200044F
4F0445044A044900200044F
0445044A044900200044F
45044A044900200044F
044A044900200044F
4A044900200044F
044900200044F
4900200044F
00200044F
200044F
0044F
44F
яхъщ

На выводе обрезает почему то все символы которые идут после 'пробела'

Символ 0020

Вот хоть убей всегда все что после 0020 урезает (

Где ошибка ткните носом плиз

Genie
[steck(~)]$ ./conv 044F0445044A044900200044F

imho, у тебя тут косячок-с. должно быть так:

[steck(~)]$ ./conv 044F0445044A04490020044F

Steck

да но это тоже не рашает проблему :( все что после 0020 пропадает неизвесно куда

Genie

может, пропадает всё, что после «00» — который кодируется и, вероятно, понимается, как «\000» — символ окончания строки?

Steck

Да возможно

но если кодировать сразу по 4е символа

sscanf(&src[4*i],"%02X",&Out[i]);

То потом iconv()

ругается :-(

Genie

ну попробуй в другую сторону сперва сделать — из KOI8-R в UCS-2.

посмотри, какое там получается кодирование.

и уже его пытайся обратно перекодировать.

rgo

гг. ты когда научишься компилировать с опцией -Wall?

напр. gcc меня ткнул носом вот в этот

char *Out=NULL;
/*...*/
sscanf(&src[2*i],"%02X",&Out[i]);

он замечательно работает на x86, но на little-endian машине, судя по всему перестанет. но это так — к слову.

ты уверен в корректности работы strlen с ucs2 строками?