Сейчас на форуме: jinoweb, bartolomeo, rmn (+5 невидимых) |
eXeL@B —› Программирование —› Hex ascii |
. 1 . 2 . >> |
Посл.ответ | Сообщение |
|
Создано: 14 апреля 2017 05:15 · Поправил: Rio · Личное сообщение · #1 Hi All! Вопрос к знатокам си: на входе "hex" строка (тип) вида: a9157af4, необходимо записать в ascii в файл (бинарник). есть ли у кого готовое решение. Прилагаю примеры файлов. f918_14.04.2017_EXELAB.rU.tgz - 1.zip |
|
Создано: 14 апреля 2017 05:22 · Личное сообщение · #2 |
|
Создано: 14 апреля 2017 05:28 · Поправил: Rio · Личное сообщение · #3 |
|
Создано: 14 апреля 2017 06:10 · Личное сообщение · #4 |
|
Создано: 14 апреля 2017 06:26 · Поправил: Rio · Личное сообщение · #5 |
|
Создано: 14 апреля 2017 06:36 · Поправил: TryAga1n · Личное сообщение · #6 Держи f806_14.04.2017_EXELAB.rU.tgz - Rio.rar По сути весь алгоритм заключен в Code:
| Сообщение посчитали полезным: Rio |
|
Создано: 14 апреля 2017 06:38 · Поправил: Rio · Личное сообщение · #7 TryAga1n пишет: Держи Благодарю, отпишусь Добавлено спустя 13 минут TryAga1n пишет: По сути весь алгоритм заключен в Да, смущает b:=Byte(StrToInt('$' + Copy(строка, i - 1, 2))); ....... Code:
|
|
Создано: 14 апреля 2017 08:23 · Личное сообщение · #8 Rio пишет: StrToInt('$' ну нету в сях такого извращения.. на.. 1ая ссылка в гугле.. http://stackoverflow.com/questions/3381614/c-convert-string-to-hexadecimal-and-vice-versa там много интересных решений... в том числе и через статический масив. накопипасть себе и будет счастье быстрый вариант.. это через case старший и младший полубайт по коду символа.. с последущим сдвигом андом switch str[i] { case:30 bHi=0; -//'0' case:31 -//'1' } resByte = bHi<<4 & bLow вобщем идея ясна? ----- Наша работа во тьме, Мы делаем, что умеем. Мы отдаем, что имеем, Наша работа во тьме.... |
|
Создано: 14 апреля 2017 10:26 · Поправил: Veliant · Личное сообщение · #9 |
|
Создано: 14 апреля 2017 11:00 · Поправил: dosprog · Личное сообщение · #10 Veliant пишет: Да... сложная задача... ) Можно же усложнить. Мой вариант: b6ad_14.04.2017_EXELAB.rU.tgz - HR.RAR | Сообщение посчитали полезным: Rio |
|
Создано: 14 апреля 2017 12:43 · Личное сообщение · #11 6356_14.04.2017_EXELAB.rU.tgz - hex-2-bin.7z | Сообщение посчитали полезным: sefkrd |
|
Создано: 14 апреля 2017 13:07 · Поправил: dosprog · Личное сообщение · #12 |
|
Создано: 14 апреля 2017 14:43 · Личное сообщение · #13 |
|
Создано: 14 апреля 2017 15:19 · Личное сообщение · #14 mysterio пишет: стандартную функцию HexToBin и правда есть Code:
| Сообщение посчитали полезным: gazlan |
|
Создано: 14 апреля 2017 17:53 · Поправил: Rio · Личное сообщение · #15 Искренне Всем от души, пробую такой вариант (нервных просьба не смотреть Code:
файл даже не создаётся... |
|
Создано: 14 апреля 2017 18:47 · Личное сообщение · #16 |
|
Создано: 14 апреля 2017 19:10 · Поправил: Rio · Личное сообщение · #17 Какой-то "злой рок" вот код: Code:
9e7d_14.04.2017_EXELAB.rU.tgz - Безымянный.zip |
|
Создано: 14 апреля 2017 19:34 · Поправил: dosprog · Личное сообщение · #18 |
|
Создано: 14 апреля 2017 19:37 · Личное сообщение · #19 и ещё, запустил в 6 builde're всё без ошибок, но файл получился совсем не то. во вложении 15dc_14.04.2017_EXELAB.rU.tgz - out.bin |
|
Создано: 14 апреля 2017 19:47 · Поправил: kampaster · Личное сообщение · #20 |
|
Создано: 14 апреля 2017 19:49 · Личное сообщение · #21 Rio пишет: int BufSize = Edit1->Text.Length() * 4; Зачем " * 4", если нужно " / 2"? Rio пишет: char *Buffer = new char(BufSize); А скобочки точно не квадратные нужны? Rio пишет: Buffer = "\0";//наверное окончание строки не нужно? Тут ты не окончание строки записал, а изменил адрес, который хранился в переменной Buffer на адрес константной пустой строки. Buffer[0] = '\0'; же, ну (хотя он и не нужен). |
|
Создано: 14 апреля 2017 20:13 · Поправил: kampaster · Личное сообщение · #22 |
|
Создано: 14 апреля 2017 21:52 · Поправил: Rio · Личное сообщение · #23 Прошу у Всех прощения за неточно поставленную задачу. Имеется в коде проги Code:
Как применить предложенный вариант dosprog к моей задаче? Code:
Code:
Предложенные исходники, сам поправить не могу ещё раз извиняюсь |
|
Создано: 14 апреля 2017 22:25 · Поправил: dosprog · Личное сообщение · #24 Так в чём проблемы?, - учитывая выложенную выше программку с процедурой a2b(int), берём и пишем что-то типа такого: { char print[] = "313233343536373839414243444546"; int i, n=strlen(print)/2*2; unsigned int cinp; unsigned char b; char* pOutBin = &print[0]; for(i=0;i<n;i++) { cinp=a2b((unsigned int)print[i]); b=(unsigned char)cinp<<4; i++; cinp=a2b((unsigned int)print[i]); b+=(unsigned char)cinp; pOutBin[i/2]=b; } fwrite (pOutBin, 1 ,n/2 , fpout); } fclose (fpout); |
|
Создано: 14 апреля 2017 22:27 · Поправил: Rio · Личное сообщение · #25 dosprog пишет: Так в чём проблемы, - учитывая выложенную выше программку с процедурой c2b(int), берём и пишем что-то типа такого: щас попробую ...... Code:
|
|
Создано: 14 апреля 2017 23:02 · Личное сообщение · #26 |
|
Создано: 14 апреля 2017 23:05 · Личное сообщение · #27 |
|
Создано: 14 апреля 2017 23:07 · Поправил: dosprog · Личное сообщение · #28 Та да, тема достойна програмисского форума на басике --Добавлено-- К следующему посту: Rio пишет: всё нормально, но не сходится с оригинальным файлом: Потому что данные надо заполнять аккуратно. Например вот так: char print[] = "C0020000000000A917728DA4416A93E3C166A0A38160A705C15CAC09015B93E581560B8F" "E153339E0151A1EB8145B4DDA1438C2741411868C11A0D9221140FA9610E9A15A16D1DA2" "025A2E2042503585425010A6224C2F876238A482E22EAAC4E21718AB8200000000000000" "000000000000000000000000000000000000000000000000000000000000000000000000" "0000000000000000000000000000000000000000000000000000000000000000002697C0" "C0080000000000A917728DA4416A93E3C166A0A38160A705C15CAC09015B93E581560B8F" "E153339E0151A1EB8145B4DDA1438C2741411868C11A0D9221140FA9610E9A15A16D1DA2" "025A2E2042503585425010A6224C2F876238A482E22EAAC4E21718AB8200000000000000" "000000000000000000000000000000000000000000000000000000000000000000000000" "000000000000000000000000000000000000000000000000000000000000000000269DC0"; Тогда сойдётся. |
|
Создано: 14 апреля 2017 23:37 · Личное сообщение · #29 dosprog пишет: Поправил. --> Link <-- всё нормально, но не сходится с оригинальным файлом: 1b33_15.04.2017_EXELAB.rU.tgz - 1.zip Добавлено спустя 6 минут dosprog пишет: Потому что данные надо заполнять аккуратно. в том и дело что изначально как я и писал выше всё идёт в таком виде: AnsiString print = "c0200000a9157af47175aa456151b46e14e8be41438aa5412caadd12ba69d4129de7e1688c1f82639688a24f1521624c1820624599a182429dc5423a6a62 2371940622e2546c22db26c22c296821f1b2a2179fc462000000000000000000000000000000000000000000000000000000000000000000000000000000000000 2013c0c0800000a9157af47175aa456151b46e14e8be41438aa5412caadd12ba69d4129de7e1688c1f82639688a24f1521624c1820624599a182429dc5423a6a62 2371940622e2546c22db26c22c296821f1b2a2179fc462000000000000000000000000000000000000000000000000000000000000000000000000000000000000 2019c0" вот и проблема... нельзя ли исправить Ваш алгоритм? |
|
Создано: 14 апреля 2017 23:47 · Поправил: dosprog · Личное сообщение · #30 Что значит - "изначально"? Может, изначально там текст был покуёвженный или что ещё. Сейчас нормально конвертится текст 720 байтов в bin 720/2=360 байтов. Какие проблемы? Вон были изначально файлы: |
. 1 . 2 . >> |
eXeL@B —› Программирование —› Hex ascii |
Эта тема закрыта. Ответы больше не принимаются. |