![]() |
|
Модераторы: bsa |
![]()
|
|
| Viroman |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 140 Регистрация: 28.7.2008 Репутация: нет Всего: нет |
Здравствуйте, вот это дилемма, я не знаю, как её решить?
Предположим, доделал свою прогу так, чтобы она из вереницы хексадецимальных чисел создавала бы на выходе ansi characters, но вот с нулями загвоздочка, она не очень то хочет этим заниматься. Как всё таки решить проблему? Буду рад ответам. |
|||
|
||||
| mrbrooks |
|
|||
![]() трололомен ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 4259 Регистрация: 4.10.2006 Где: Дол Гулдур Репутация: 19 Всего: 306 |
||||
|
||||
| mes |
|
|||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 79 Всего: 250 |
А нельзя ли писать вопрос так, чтоб читающим было понятно, что Вы хотите получить ?
char c = '\0'; // Вот вам нуль в чаре, что еще требуется ? Это сообщение отредактировал(а) mes - 2.9.2008, 15:22 |
|||
|
||||
| Viroman |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 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. То есть почему то он считает, что на этом строка закончилась. |
|||
|
||||
| Ches |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 84 Регистрация: 19.8.2008 Репутация: нет Всего: 3 |
очень вежливо и учтиво попросить эту прогу з.ы. Дэвид Блейн в отпуске, оставшиеся на форуме не обладают навыками уличной магии и не могут догадаться, какие манипуляции производит "прога" з.з.ы. что такое "хексадецимальное" число? какое основание? |
|||
|
||||
| mrbrooks |
|
|||
![]() трололомен ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 4259 Регистрация: 4.10.2006 Где: Дол Гулдур Репутация: 19 Всего: 306 |
Viroman, интересно а что ты вообще делаешь?
|
|||
|
||||
| mes |
|
||||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 79 Всего: 250 |
A к вашему сведенью он зарезервирован, только в функциях вывода стандартных си функций и их аналогов. То есть для тех функций которые используют Си-строку.
Подобная фраза ничего не говорит. Все зависит от того куда идет вывод. Консоль к примеру имеет свое представление на соответствие кодов символам и ничего тут не исправишь. Вы судя по всему хотите по своему интерпретировать значения строки, но пока Вы не осветите задание нормально, вряд ли Вам кто сможет помочь. (разве что какой нибудь телепат) Добавлено через 51 секунду HEX , 16ти-ричная система счисления |
||||
|
|||||
| Ches |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 84 Регистрация: 19.8.2008 Репутация: нет Всего: 3 |
ну дык по-русски это и есть 16-ричное... я думал, мож чё нового изобрели Насколько я понял, нулю вообще не соответствует символ, в том и загвоздка. Разговор об этом? |
|||
|
||||
| mes |
|
|||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 79 Всего: 250 |
но только вот абсолютно неясно куда он его выводит и как .. |
|||
|
||||
| Viroman |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 140 Регистрация: 28.7.2008 Репутация: нет Всего: нет |
Ввод идёт через командную строку, попадает в argv, вывод идёт на один девайс через DeviceIoControl, принимает только char *
To что это можно через стринги реализовать, знаю, делал уже, и получалось, однако оно не то.. Вот код примера с выводом в файл.
PS: открываемый девайс несуществующий, но для общего понимания хватит. Основная программа выглядит чуть иначе, с проверками наличия аргументов, задержки итп, но вот этого абсолютно хватит, чтобы понять функцию программы. PS: не забудьте создать батник предположим, и туда пишите progrramm.exe AABBCCDD01 и тому подобное, на выходе создастся файл, в котором вывов ввиде ansi. Откройте в hex редакторе, но вот с 00 не получается, а на вывод DeviceIoControl это необходимо именно вот так.. Помогите пожалуйста. |
|||
|
||||
| Viroman |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 140 Регистрация: 28.7.2008 Репутация: нет Всего: нет |
Правильно ли я понимаю, ни у одного из отметившихся в этой форумной ветке нет никаких идей, как эту паразитивную особенность исправить, переделать, итп, лишь бы умело \x0 отсылать.
Может будут идеи? По мне пусть другой путь, лишь бы DeviceIoControl понимал.. |
|||
|
||||
| bsa |
|
||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 85 Всего: 196 |
Пример использования:
|
||||
|
|||||
| mes |
|
|||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 79 Всего: 250 |
Ну на этой части проблеммы есть ? если нету то зачем загружаете отвечающих ненужными подробностями ? Насколько я теперь понимаю проблема состоит в том, что если Вы на устройство передаете си строку, содержащую \0, то строка обрезается ? В случае с файлом Вы используете не подходяшую функцию. Вы должны записывать буффер, а не строку, так как для строки \0 является символом окончания. Но как мне кажется , пример с файлом просто демонстрационный, и проблема лежит на взаимодействии с DeviceIoControl. Однако точно ответить, почему Ваш несушествующий девайс работает неправильно, нереально.. Так как догадаться, что за ним скрывается и как реализовано, возможным не представляется. А вы в свою очередь приняли все меры, чтоб нормально изъяснить проблему и показать проблемные места. Нет. понимаете неправильно. Скорей всего просто многие из тех , кто мог бы ответить, просто не стали читать кучу неразборчивого текста, а из тех кто стал, мало кто понял о чем речь. Сорри конечно за кучу нравоучений.. ничего личного.. в общем используйте понятие буффер вместо строки и будет Вам счастье. пример для файла привел выше bsa. А если еще ознакомитесь со статьей по ссылке в его подписи, то и на долю отвечающих тоже немного счастья перепадет Это сообщение отредактировал(а) mes - 2.9.2008, 18:42 |
|||
|
||||
| Viroman |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 140 Регистрация: 28.7.2008 Репутация: нет Всего: нет |
bsa, к сожалению и этот код не работает, в том стринге AABBCC00DDEE12345678, где также присутствует 00, программа переводит его в AABBCCE0DD...итп
А также неправильно переводит численные значения, в общем даже мой код в этом отношении лучше.. Добавлено @ 18:46
Я вас прощу за нравоучения, лишь когда приведёте рабочий код, и чтобы в файле нормально откладывался, а до тех пор это останется излишней болтологией, к тому же пример с буффером PS: на примеры с мемори аллкацией как буффер можно даже не заикаться, оно то же самое выдаёт.. Это сообщение отредактировал(а) Viroman - 2.9.2008, 18:52 |
|||
|
||||
| mes |
|
||||||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 79 Всего: 250 |
так в чем у Вас все таки проблема ? в переводе или в выводе? в том что вместо двойного 0, одинарный записывается ? или в том что после нуля строчка обрывается? или в чем то другом ?
a код bsa неправильно откладывает ? так Вы хоть вобще представляете что именно Вам нужно ? какая разница как получен буффер, если у Вас вывод не работает.
для примера с буффером , я Вам указал на пример (котырый другой отвечающий успел написать до меня):
тут запись идет не строки, а n-гo кол-ва байт. Этим отличается вСи понятия строка и буффер символов. (тем что у буфера символы не являются управляюшими). Кстати с вышеуказанной ссылкой судя по всему Вы даже и не постарались ознакомиться.. очень жаль.. |
||||||
|
|||||||
| Viroman |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 140 Регистрация: 28.7.2008 Репутация: нет Всего: нет |
Такое ощущение, будто бы вы компьютерный бот Ещё раз, внимание, 00 переводится не в 00, а в E0, в том коде, что дал мне bsa, спасибо ему, он молодец, хоть как то старался помочь.. |
|||
|
||||
| mes |
|
|||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 79 Всего: 250 |
Как Вы догадались ? так объясните, при чем тут ошибка перевода, когда проблема у Вас была с выводом и bsa привел способ как справиться с этим. подставили бы свой код по преобразованию, а код вывода взали бы от bsa.. Вы вот так хотя бы попробовали ?
Это сообщение отредактировал(а) mes - 2.9.2008, 22:18 |
|||
|
||||
| Viroman |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 140 Регистрация: 28.7.2008 Репутация: нет Всего: нет |
Я новичок и только как неделю начал разбираться с c++, потому ещё не знаю, какую библиотеку надо включать, чтобы write работал.
А то пишет, что missing prototype for 'writе' |
|||
|
||||
| Viroman |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 140 Регистрация: 28.7.2008 Репутация: нет Всего: нет |
PS: применил fwrite(&c, 1, sizeof(&c), myfile); так работает оутпут, теперь надо поглядеть, что моя прога в самом деле выдаёт..
Добавлено через 6 минут и 57 секунд PPS: моя программа где то тоже сама портачит, и не хочет 00 писать, то есть как бы она игнорирует его.. Наверное функция concatenate не работает корректно, а именно подфункция либо strcat, либо strcpy.. |
|||
|
||||
| mes |
|
|||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 79 Всего: 250 |
функции с си-строкой воспринимают масив символов до первого нуля, именно поэтому и предложил Вам использовать понятие буффер, вместо понятия си-строки для вашей цели, тогда сразу будет видно какие функции не подходят. ну если С++, а не С, то лучше использовать std::string , себе же легче.. Это сообщение отредактировал(а) mes - 3.9.2008, 00:38 |
|||
|
||||
| Viroman |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 140 Регистрация: 28.7.2008 Репутация: нет Всего: нет |
Мы идём тернистым путём, си так си |
|||
|
||||
| mes |
|
|||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 79 Всего: 250 |
||||
|
||||
| Viroman |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 140 Регистрация: 28.7.2008 Репутация: нет Всего: нет |
В общем, я так и делал string.c_str(), нo толка ещё много не знаю, потому не знал, как сделать, в остальном разобрался уже. Мне код от bsa понравился, только там ошибочка небольшая, после исправления правильно подаёт.
Там где return (dig >= 'A') ? (dig - 'A' + 10) : (dig - '0'); исправить на return (dig >= 'A') ? (dig - 'A' + 10) : (dig - 16); На этом эпопея может считаться закрытой до худших времён :=) |
|||
|
||||
| mes |
|
||||||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 79 Всего: 250 |
В примере bsa использовался хак для приведения символа к верхнему регистру. Дело в том что такой прием можно применять только к буквенным символам английского алфавита, на остальные символы он имет трудно предсказуемое воздействие. bsa явно указал в примере, что он дает направление , а не готовое решение и приведение кода в нормуперекладывает на Ваши плечи. Вы вместо того, чтоб ограничить воздействаие на нужный диапозон символов, пытаетесь лечить последствия. Такой метод программирования очень опасный, так как очень затрудняет читабельность кода и дает основание для появления трудно отлавливыемых ошибок. если уж не хотите добавлять проверок то хотя бы заменить на
вот другой вариант
и наконец полный вариант
не забудь тогда пометить тему как решенную Это сообщение отредактировал(а) mes - 3.9.2008, 13:50 |
||||||
|
|||||||
| Viroman |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 140 Регистрация: 28.7.2008 Репутация: нет Всего: нет |
Не вижу особой надобности вставлять защиты от дурака и гонять лишние процциклы. Если бы для коммерческого пользования, то да, а для себя я и так знаю, какие символы входят в разрешённые |
|||
|
||||
| bsa |
|
||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 85 Всего: 196 |
Эх... знал, что меня этот & 0x5F когда-нибудь погубит... дождался
Надо заменить
на
|
||||
|
|||||
| mes |
|
|||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 79 Всего: 250 |
ну если Вам охота выполнять работу за компилятор и постояно при любых изменениях самостоятельно контроллировать правильность всех условий, то конечно продолжайте так писать. Однако мне кажется , что у программиста, и без того полно проблем, чтоб еще держать в голове каждую строчку кода. |
|||
|
||||
![]()
|
| Правила форума "C/C++: Для новичков" | |
|
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Для новичков | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |