Сейчас на форуме: jinoweb, bartolomeo, rmn (+5 невидимых)

 eXeL@B —› Программирование —› Hex ascii
<< . 1 . 2 .
Посл.ответ Сообщение

Ранг: 95.5 (постоянный), 36thx
Активность: 0.080.04
Статус: Участник

Создано: 14 апреля 2017 05:15 · Поправил: Rio
· Личное сообщение · #1

Hi All!
Вопрос к знатокам си:
на входе "hex" строка (тип) вида: a9157af4, необходимо записать в ascii в файл (бинарник).
есть ли у кого готовое решение.
Прилагаю примеры файлов.

f918_14.04.2017_EXELAB.rU.tgz - 1.zip



Ранг: 95.5 (постоянный), 36thx
Активность: 0.080.04
Статус: Участник

Создано: 14 апреля 2017 23:50 · Поправил: Rio
· Личное сообщение · #2

dosprog пишет:
Сейчас нормально конвертится текст 720 байтов в bin 720/2=360 байтов.
Какие проблемы?

в приложенном файле ведь 260 вместо 360...

Code:
  1. void __fastcall TForm1::Button1Click(TObject *Sender)
  2. {
  3. FILE *out;
  4. //AnsiString print = "c0200";
  5. {
  6. out = fopen("out.bin", "wb");
  7.  
  8. char print[] = "c0200000a9157af47175aa456151b46e14e8be41438aa5412caadd12ba69d4129de7e1688c1f82639688a24f1521624c1820624599a182429dc5423a6a622371940622e2546c22db26c22c296821f1b2a2179fc4620000000000000000000000000000000000000000000000000000000000000000000000000000000000002013c0c0800000a9157af47175aa456151b46e14e8be41438aa5412caadd12ba69d4129de7e1688c1f82639688a24f1521624c1820624599a182429dc5423a6a622371940622e2546c22db26c22c296821f1b2a2179fc4620000000000000000000000000000000000000000000000000000000000000000000000000000000000002019c0";
  9. int i, n=strlen(print)/2*2;
  10. unsigned int cinp;
  11. unsigned char b;
  12. char* pOutBin = &print[0];
  13. for(i=0;i<n;i++)
  14. {
  15. cinp=a2b((unsigned int)print[i]); b=(unsigned char)cinp<<4; i++;
  16. cinp=a2b((unsigned int)print[i]); b+=(unsigned char)cinp;
  17. pOutBin[i/2]=b;
  18. }
  19. fwrite (pOutBin, 1 ,n/2 , out);
  20. }
  21. fclose (out);
  22. }


получается вот:

0900_15.04.2017_EXELAB.rU.tgz - 1.rar

в правильном:
C0 02 00 00 00 00 00 A9
после преобразования:
C0 20 00 00 A9
(начало бинарника)



Ранг: 431.7 (мудрец), 390thx
Активность: 0.730.32
Статус: Участник

Создано: 15 апреля 2017 00:02 · Поправил: dosprog
· Личное сообщение · #3

Rio пишет:
в приложенном файле ведь 260 вместо 360..


Я выше дал ссылку, могу повторить: --> Link <--



Ранг: 95.5 (постоянный), 36thx
Активность: 0.080.04
Статус: Участник

Создано: 15 апреля 2017 00:05 · Поправил: Rio
· Личное сообщение · #4

dosprog пишет:
Я дал ссылку, могу повторить: --> Link <--

извини dosprog беда вот выше
вот из этой строки правильный


dae7_15.04.2017_EXELAB.rU.tgz - 2.rar



Ранг: 431.7 (мудрец), 390thx
Активность: 0.730.32
Статус: Участник

Создано: 15 апреля 2017 00:08 · Поправил: dosprog
· Личное сообщение · #5

Ещё раз.
Берём архив с двумя файлами из старт поста. --> Link <--
Аккуратно заполняем данные в программе.
И на выходе получаем вдвое меньший по размеру файл, чем был тот с hex-строкой.
Алгоритм работает, как трактор.
) Бомба.

Добавлено спустя 2 минуты
Данные в программе короче аккуратно заполняем, да


Rio пишет:
в правильном:
C0 02 00 00 00 00 00 A9
после преобразования:
C0 20 00 00 A9
(начало бинарника)


Что задал в программе, то и получил. Нет проблем. -

Rio пишет:
char print[] = "c0200000a9157a


Данные в программе заполняем аккуратно





Ранг: 95.5 (постоянный), 36thx
Активность: 0.080.04
Статус: Участник

Создано: 15 апреля 2017 00:13
· Личное сообщение · #6

dosprog пишет:
аккуратно заполняем

строка динамически приходит, вот.
если скопировать код с "кнопкой" выше, то получим 260 байт, а строка из первого поста...



Ранг: 431.7 (мудрец), 390thx
Активность: 0.730.32
Статус: Участник

Создано: 15 апреля 2017 00:18 · Поправил: dosprog
· Личное сообщение · #7

Блин.
В правильном коде за байтом 0x02 идёт 5 нолей, следом байт 0xA9.
У тебя в программе задано не 0x02, а 0х20 и следом 2 ноля, затем тот же байт 0xA9.
То ты на выходе и получил. Нормально.

Всё, тему можно закрывать.



Ранг: 95.5 (постоянный), 36thx
Активность: 0.080.04
Статус: Участник

Создано: 15 апреля 2017 00:20 · Поправил: Rio
· Личное сообщение · #8

dosprog куча извинений, щас буду смотреть.
Ещё раз извиняюсь, невнимательность с моей стороны.
Огромное спасибо dosprog и всем откликнувшимся.
С уважением, Rio.




Ранг: 307.9 (мудрец), 196thx
Активность: 0.180
Статус: Участник

Создано: 15 апреля 2017 00:27 · Поправил: mysterio
· Личное сообщение · #9

// Для потомков: ....
dosprog пишет потомки не простят
вон уже не простили Rio пишет: это не на сях.... тогда уберу за ненадобностью.

-----
Don_t hate the cracker - hate the code.




Ранг: 431.7 (мудрец), 390thx
Активность: 0.730.32
Статус: Участник

Создано: 15 апреля 2017 00:29
· Личное сообщение · #10

mysterio пишет:
// Для потомков:


) потомки не простят



Ранг: 95.5 (постоянный), 36thx
Активность: 0.080.04
Статус: Участник

Создано: 15 апреля 2017 00:31 · Поправил: Rio
· Личное сообщение · #11

Ещё раз благодарю Всех, сохранял %x, а надо %02x


<< . 1 . 2 .
 eXeL@B —› Программирование —› Hex ascii
Эта тема закрыта. Ответы больше не принимаются.
   Для печати Для печати