Модераторы: bsa

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Хексадецимальное число 00 перевести в ANSI аналог! Неужели невозможно? 
V
    Опции темы
Viroman
Дата 2.9.2008, 15:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 140
Регистрация: 28.7.2008

Репутация: нет
Всего: нет



Здравствуйте, вот это дилемма, я не знаю, как её решить?
Предположим, доделал свою прогу так, чтобы она из вереницы хексадецимальных чисел создавала бы на выходе ansi characters, но вот с нулями загвоздочка, она не очень то хочет этим заниматься. Как всё таки решить проблему?
Буду рад ответам.
PM MAIL   Вверх
mrbrooks
Дата 2.9.2008, 15:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


трололомен
****


Профиль
Группа: Завсегдатай
Сообщений: 4259
Регистрация: 4.10.2006
Где: Дол Гулдур

Репутация: 19
Всего: 306



Цитата(Viroman @  2.9.2008,  15:10 Найти цитируемый пост)
хексадецимальных чисел
 круто  smile 

что именно то создаешь - числа и символы (то бишь текст)?
зы. выложи код чего хоть наваял.
PM MAIL   Вверх
mes
Дата 2.9.2008, 15:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



А нельзя ли писать вопрос так, чтоб читающим было понятно, что Вы хотите получить ? 
char c = '\0';  // Вот вам нуль в чаре, что еще требуется ?


Это сообщение отредактировал(а) mes - 2.9.2008, 15:22


--------------------
PM MAIL WWW   Вверх
Viroman
Дата 2.9.2008, 15:35 (ссылка)    | (голосов:3) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 140
Регистрация: 28.7.2008

Репутация: нет
Всего: нет



Предположим, задал такой параметр в коммандную строку AABBCC99 итп, из этого хексадецимального барахла должна получиться буквенная абракадабра, то есть всякие разные знаки из 256 штук, поясню, если открыть файл, в котором эти самые знаки находятся каким нибудь HEX редактором, то увидишь их эквивалент в хекформате, то бишь знаки показываются там в хексформате как AABBCC99 итп.
Но вот с двумя нулями 00 ничего не выходит..

Добавлено через 7 минут и 19 секунд
К вашему сведению \0 зарезервирован. Он означает, что на этом месте стринг заканчивается.
А то что я хочу, возьмите предположим следующее...
UCHAR chislo[32]="\xAA\xBB\xCC\x99";
И выдайте его на оутпут, это и есть искомое.
Но если попробуете задать так, UCHAR chislo[32]="\xAA\x00\xBB\xCC\x99";
То оутпут будет оборван после AA. То есть почему то он считает, что на этом строка закончилась.
PM MAIL   Вверх
Ches
Дата 2.9.2008, 15:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 84
Регистрация: 19.8.2008

Репутация: нет
Всего: 3



Цитата(Viroman @  2.9.2008,  15:10 Найти цитируемый пост)
доделал свою прогу так, чтобы она из вереницы хексадецимальных чисел создавала бы на выходе ansi characters, но вот с нулями загвоздочка, она не очень то хочет этим заниматься. Как всё таки решить проблему?

 smile 
очень вежливо и учтиво попросить эту прогу

з.ы. Дэвид Блейн в отпуске, оставшиеся на форуме не обладают навыками уличной магии и не могут догадаться, какие манипуляции производит "прога" smile 

з.з.ы. что такое  "хексадецимальное" число? какое основание?
PM MAIL ICQ   Вверх
mrbrooks
Дата 2.9.2008, 15:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


трололомен
****


Профиль
Группа: Завсегдатай
Сообщений: 4259
Регистрация: 4.10.2006
Где: Дол Гулдур

Репутация: 19
Всего: 306



Viroman, интересно а что ты вообще делаешь?
PM MAIL   Вверх
mes
Дата 2.9.2008, 16:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



Цитата(Viroman @  2.9.2008,  15:35 Найти цитируемый пост)
К вашему сведению \0 зарезервирован. Он означает, что на этом месте стринг заканчивается.

A к вашему сведенью он зарезервирован, только в функциях вывода стандартных си функций и их  аналогов.
То есть для тех функций которые используют Си-строку. 

Цитата(Viroman @  2.9.2008,  15:35 Найти цитируемый пост)
должна получиться буквенная абракадабра, то есть всякие разные знаки из 256 штук,

Подобная фраза ничего не говорит. Все зависит от того куда идет вывод. 
Консоль к примеру имеет свое представление на соответствие кодов символам и ничего тут не исправишь.
Вы судя по всему хотите по своему интерпретировать значения строки, но пока Вы не осветите задание нормально, вряд ли Вам кто сможет помочь. (разве что какой нибудь телепат)  smile

Добавлено через 51 секунду
Цитата(Ches @  2.9.2008,  15:51 Найти цитируемый пост)
з.з.ы. что такое  "хексадецимальное" число? какое основание? 

HEX , 16ти-ричная система счисления


--------------------
PM MAIL WWW   Вверх
Ches
Дата 2.9.2008, 16:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 84
Регистрация: 19.8.2008

Репутация: нет
Всего: 3



Цитата(mes @  2.9.2008,  16:01 Найти цитируемый пост)
Добавлено через 51 секунду
Цитата(Ches @  2.9.2008,  15:51 Найти цитируемый пост)
з.з.ы. что такое  "хексадецимальное" число? какое основание? 

HEX , 16ти-ричная система счисления 

ну дык по-русски это и есть 16-ричное... я думал, мож чё нового изобрели

Насколько я понял, нулю вообще не соответствует символ, в том и загвоздка. Разговор об этом?

PM MAIL ICQ   Вверх
mes
Дата 2.9.2008, 16:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



Цитата(Ches @  2.9.2008,  16:17 Найти цитируемый пост)
Насколько я понял, нулю вообще не соответствует символ, в том и загвоздка


Цитата(Viroman @  2.9.2008,  15:35 Найти цитируемый пост)
Но если попробуете задать так, UCHAR chislo[32]="\xAA\x00\xBB\xCC\x99";
То оутпут будет оборван после AA. То есть почему то он считает, что на этом строка закончилась. 


но только вот абсолютно неясно куда он его выводит и как .. 



--------------------
PM MAIL WWW   Вверх
Viroman
Дата 2.9.2008, 16:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 140
Регистрация: 28.7.2008

Репутация: нет
Всего: нет



Ввод идёт через командную строку, попадает в argv, вывод идёт на один девайс через DeviceIoControl, принимает только char *
To что это можно через стринги реализовать, знаю, делал уже, и получалось, однако оно не то..
Вот код примера с выводом в файл.
Код

#include <windows.h>
#include <stdio.h>

char *substract(const char *pstr, int start, int numchars) { char * pnew=(char *)malloc(numchars+1); strncpy(pnew, pstr + start, numchars); pnew[numchars] = '\0'; return pnew; }
char *concatenate(char *s1, char *s2) { int len = strlen(s1) + strlen(s2) + 1; char *c = (char*)malloc(len); strcpy(c, s1); strcat(c, s2); return c; }

char * disq;
char teildis;
char * tempstr;
int lenio;
int i,is;
char * pch;
char * gh="\\\\.\\";
FILE * myfile;

int main(int argc, char * argv[]) {
for(i=1; i!=argc; i=i+1) {
pch=argv[i];
lenio=strlen(pch);
disq=concatenate("","");
for(is=0; is<lenio; is=is+2) {
tempstr=(char *)substract(pch,is,2);
teildis=(char)strtol(tempstr,NULL,16);
disq=concatenate(disq,&teildis);
}
DeviceIoControl(gh,0x220000,disq,(lenio/2),NULL,0,NULL,NULL);
myfile=fopen("myfile.txt","a+"); fputs(disq,myfile); fclose(myfile);
}//fori

return EXIT_SUCCESS;
}

PS: открываемый девайс несуществующий, но для общего понимания хватит. Основная программа выглядит чуть иначе, с проверками наличия аргументов, задержки итп, но вот этого абсолютно хватит, чтобы понять функцию программы.
PS: не забудьте создать батник предположим, и туда пишите progrramm.exe AABBCCDD01 и тому подобное, на выходе создастся файл, в котором вывов ввиде ansi. Откройте в hex редакторе, но вот с 00 не получается, а на вывод DeviceIoControl это необходимо именно вот так..
Помогите пожалуйста.
PM MAIL   Вверх
Viroman
Дата 2.9.2008, 17:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 140
Регистрация: 28.7.2008

Репутация: нет
Всего: нет



Правильно ли я понимаю, ни у одного из отметившихся в этой форумной ветке нет никаких идей, как эту паразитивную особенность исправить, переделать, итп, лишь бы умело \x0 отсылать.
Может будут идеи? По мне пусть другой путь, лишь бы DeviceIoControl понимал..
PM MAIL   Вверх
bsa
Дата 2.9.2008, 17:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 85
Всего: 196



Код
char aciiDigToInt(char dig)
{
    dig &= 0x5F; //приведение к верхнему регистру
    return (dig >= 'A') ? (dig - 'A' + 10) : (dig - '0');
}
char * translate(const char *src, unsigned long *dst_size)
{
    unsigned long buffer_size = 128;
    char * buffer = (char*)malloc(buffer_size);
    char *p = buffer;
    *dst_size = 0;
    while(src[0] && src[1]) {
        if (*dst_size >= buffer_size) {
             buffer_size *= 2;
             buffer = (char*)realloc(buffer, buffer_size);
             p = buffer + *dst_size;
        }
        *p++ = (aciiDigToInt(src[0]) << 4) + aciiDigToInt(src[1]);
        src += 2;
        ++*dst_size;
    }
    return buffer;
}
функция translate вернет указатель на данные. переменная, на которую указывает dst_size примет размер данных.
Пример использования:
Код
unsigned long size;
char *data = translate("AABBCC00DDEE12345678", &size);
write(fd, data, size);
free(data);
Работоспособность не проверял. Цель программы - показать идею.
PM   Вверх
mes
Дата 2.9.2008, 18:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



Цитата(Viroman @  2.9.2008,  16:45 Найти цитируемый пост)
Ввод идёт через командную строку, попадает в argv, вывод идёт на один девайс через DeviceIoControl, принимает только char *

Ну на этой части проблеммы есть ? если нету то зачем загружаете отвечающих ненужными подробностями ?
Насколько я теперь понимаю проблема состоит в том, что если Вы на устройство передаете си строку, содержащую \0, то строка обрезается ?
В случае с файлом Вы используете не подходяшую функцию. Вы должны записывать буффер, а не строку, так как для строки \0 является символом окончания. Но как мне кажется , пример с файлом просто демонстрационный, и проблема лежит на взаимодействии с DeviceIoControl.

Однако точно ответить, почему Ваш несушествующий девайс работает неправильно, нереально.. Так как догадаться, что за ним скрывается и  как реализовано, возможным не представляется. А вы в свою очередь приняли все меры, чтоб нормально изъяснить проблему и показать проблемные места.  


Цитата(Viroman @  2.9.2008,  17:52 Найти цитируемый пост)
Правильно ли я понимаю, ни у одного из отметившихся в этой форумной ветке нет никаких идей, как эту паразитивную особенность исправить, переделать, итп, лишь бы умело \x0 отсылать.
Может будут идеи? По мне пусть другой путь, лишь бы DeviceIoControl понимал.. 

Нет. понимаете неправильно. Скорей всего просто многие из тех , кто мог бы ответить, просто не стали читать кучу неразборчивого текста,
а из тех кто стал, мало кто понял о чем речь.

Сорри конечно за кучу нравоучений.. ничего личного.. в общем используйте понятие буффер вместо строки и будет Вам счастье.
пример для файла привел выше bsa. А если еще ознакомитесь со статьей по ссылке в его подписи, то и на долю отвечающих тоже немного счастья перепадет smile  

Это сообщение отредактировал(а) mes - 2.9.2008, 18:42


--------------------
PM MAIL WWW   Вверх
Viroman
Дата 2.9.2008, 18:43 (ссылка)    | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 140
Регистрация: 28.7.2008

Репутация: нет
Всего: нет



bsa, к сожалению и этот код не работает, в том стринге AABBCC00DDEE12345678, где также присутствует 00, программа переводит его в AABBCCE0DD...итп
А также неправильно переводит численные значения, в общем даже мой код в этом отношении лучше..

Добавлено @ 18:46
Цитата

Сорри конечно за кучу нравоучений.. ничего личного.. в общем используйте понятие буффер вместо строки и будет Вам счастье.

Я вас прощу за нравоучения, лишь когда приведёте рабочий код, и чтобы в файле нормально откладывался, а до тех пор это останется излишней болтологией, к тому же пример с буффером smile
PS: на примеры с мемори аллкацией как буффер можно даже не заикаться, оно то же самое выдаёт..

Это сообщение отредактировал(а) Viroman - 2.9.2008, 18:52
PM MAIL   Вверх
mes
Дата 2.9.2008, 20:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



Цитата(Viroman @  2.9.2008,  18:43 Найти цитируемый пост)
bsa, к сожалению и этот код не работает, в том стринге AABBCC00DDEE12345678, где также присутствует 00, программа переводит его в AABBCCE0DD...итп
А также неправильно переводит численные значения, в общем даже мой код в этом отношении лучше..

так в чем у Вас все таки проблема ? в переводе или в выводе? 
 в том что вместо двойного 0, одинарный записывается ? или в том что после нуля строчка обрывается? или в чем то другом ?
 
Цитата(Viroman @  2.9.2008,  18:43 Найти цитируемый пост)
лишь когда приведёте рабочий код, и чтобы в файле нормально откладывался,

a код bsa неправильно откладывает ?

Цитата(Viroman @  2.9.2008,  18:43 Найти цитируемый пост)
на примеры с мемори аллкацией как буффер можно даже не заикаться, 

так Вы хоть вобще представляете что именно Вам нужно ? какая разница как получен буффер, если у Вас вывод не работает.

Цитата(Viroman @  2.9.2008,  18:43 Найти цитируемый пост)
тех пор это останется излишней болтологией, к тому же пример с буффером 

для примера с буффером , я Вам указал на пример (котырый другой отвечающий успел написать до меня):

Цитата(bsa @  2.9.2008,  17:56 Найти цитируемый пост)
char *data = translate("AABBCC00DDEE12345678", &size);
write(fd, data, size);

тут запись идет не строки, а n-гo кол-ва байт. Этим отличается вСи понятия строка и буффер символов. (тем что у буфера символы не являются управляюшими). 

Кстати с вышеуказанной ссылкой судя по всему Вы даже и не постарались ознакомиться.. очень жаль.. 










--------------------
PM MAIL WWW   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.1548 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.