Сейчас на форуме: 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



Ранг: 262.5 (наставник), 337thx
Активность: 0.340.25
Статус: Участник

Создано: 14 апреля 2017 05:22
· Личное сообщение · #2

Не понимаю в чем проблема, дели свою HEX строку по 2 символа, перегоняй в число и пиши как обычный байт в файл



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

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

TryAga1n пишет:
Не понимаю в чем проблема

если была не проблема сделал бы) есть на сях?
Хотелось бы добавить для builder'a, тип данных ansistring...



Ранг: 262.5 (наставник), 337thx
Активность: 0.340.25
Статус: Участник

Создано: 14 апреля 2017 06:10
· Личное сообщение · #4

На сях нету, могу сделать тебе на дельфях



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

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

TryAga1n пишет:
На сях нету, могу сделать тебе на дельфях

Если есть возможность, то конечно.
Не уверен, но может "перегоню" на си.



Ранг: 262.5 (наставник), 337thx
Активность: 0.340.25
Статус: Участник

Создано: 14 апреля 2017 06:36 · Поправил: TryAga1n
· Личное сообщение · #6

Держи

f806_14.04.2017_EXELAB.rU.tgz - Rio.rar

По сути весь алгоритм заключен в
Code:
  1.    for i:=2 to Length(Edit1.Text) do
  2.      if i mod 2 = 0 then begin
  3.       b:=Byte(StrToInt('$' + Copy(Edit1.Text, i - 1, 2)));


| Сообщение посчитали полезным: Rio

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

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

TryAga1n пишет:
Держи

Благодарю, отпишусь

Добавлено спустя 13 минут
TryAga1n пишет:
По сути весь алгоритм заключен в

Да, смущает b:=Byte(StrToInt('$' + Copy(строка, i - 1, 2)));
.......
Code:
  1. Ansistring str= "c0200000a9157af47175...
  2.  
  3. char array[2000];
  4.  
  5. наверное strcpy(array,str)
  6.  
  7. for (int i = 2; sizeof(array); i++)
  8. {
  9. if (/ 2 == 0)
  10. {
  11.  .....?)   :s1:
  12. }
  13.  
  14. }




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

Создано: 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

вобщем идея ясна?

-----
Наша работа во тьме, Мы делаем, что умеем. Мы отдаем, что имеем, Наша работа во тьме....




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

Создано: 14 апреля 2017 10:26 · Поправил: Veliant
· Личное сообщение · #9

Да... сложная задача...
Code:
  1. char hexBuf[3] = {0};
  2. char binBuf = '\x00';
  3. while(!feof(fInput))
  4. {
  5.   fread (hexBuf, 1, 2, fInput);
  6.   sscanf(hexBuf, "%02X", binBuf);
  7.   fwrite(binBuf, 1, 1, fOutput);
  8. }


оно же для строк
Code:
  1. for (size_t i = 0; i < (len >> 1); i++) {
  2.   sscanf(&input[i*2], "%02X", &output[i]);
  3. }




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

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

Veliant пишет:
Да... сложная задача...

) Можно же усложнить. Мой вариант: b6ad_14.04.2017_EXELAB.rU.tgz - HR.RAR



| Сообщение посчитали полезным: Rio


Ранг: 170.1 (ветеран), 96thx
Активность: 0.090.01
Статус: Участник

Создано: 14 апреля 2017 12:43
· Личное сообщение · #11

HEX-string to binary converter

6356_14.04.2017_EXELAB.rU.tgz - hex-2-bin.7z

| Сообщение посчитали полезным: sefkrd

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

Создано: 14 апреля 2017 13:07 · Поправил: dosprog
· Личное сообщение · #12

Да, перекодировка будет работать в разы быстрее тупого последовательного сравнения.
Тот случай, когда "лишние" ~250 байтов таблицы себя вполне оправдывают. Очень




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

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

Кто захочет заглянуть в хелп (Delphi, Builder и т.д.), сможет найти там стандартную функцию HexToBin.

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




Ранг: 262.5 (наставник), 337thx
Активность: 0.340.25
Статус: Участник

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

mysterio пишет:
стандартную функцию HexToBin

и правда есть
Code:
  1.        PUSH    ESI
  2.         PUSH    EDI
  3.         PUSH    EBX
  4.         MOV     ESI,EAX
  5.         MOV     EDI,EDX
  6.         MOV     EBX,EDX
  7.         MOV     EDX,0
  8.         JMP     @@1
  9. @@0:    DB       0, 1, 2, 3, 4, 5, 6, 7, 8, 9,-1,-1,-1,-1,-1,-1
  10.         DB      -1,10,11,12,13,14,15,-1,-1,-1,-1,-1,-1,-1,-1,-1
  11.         DB      -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1
  12.         DB      -1,10,11,12,13,14,15
  13. @@1:    LODSW
  14.         CMP     AL,'0'
  15.         JB      @@2
  16.         CMP     AL,'f'
  17.         JA      @@2
  18.         MOV     DL,AL
  19.         MOV     AL,@@0.Byte[EDX-'0']
  20.         CMP     AL,-1
  21.         JE      @@2
  22.         SHL     AL,4
  23.         CMP     AH,'0'
  24.         JB      @@2
  25.         CMP     AH,'f'
  26.         JA      @@2
  27.         MOV     DL,AH
  28.         MOV     AH,@@0.Byte[EDX-'0']
  29.         CMP     AH,-1
  30.         JE      @@2
  31.         OR      AL,AH
  32.         STOSB
  33.         DEC     ECX
  34.         JNE     @@1
  35. @@2:    MOV     EAX,EDI
  36.         SUB     EAX,EBX
  37.         POP     EBX
  38.         POP     EDI
  39.         POP     ESI


| Сообщение посчитали полезным: gazlan

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

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

Искренне Всем от души, пробую такой вариант (нервных просьба не смотреть

Code:
  1. void __fastcall TForm1::Button1Click(TObject *Sender)
  2. {
  3. char *Text = Edit1->Text.c_str();
  4. int BufSize = Edit1->Text.Length() * 4;
  5. char *Buffer = new char(BufSize);
  6. Buffer = "\0";//наверное окончание строки не нужно?
  7. HexToBin(Text, Buffer, BufSize);
  8. HANDLE hOut;
  9. hOut = CreateFileA("out.bin", GENERIC_WRITE, 0, NULL,
  10.                  CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
  11. WriteFile(hOut, Buffer, 4, NULL, NULL);
  12. хотелось бы через printf, но вылетает
  13. CloseHandle(hOut);
  14. //Edit2->Text = (String) Buffer;
  15. }


файл даже не создаётся...



Ранг: 222.2 (наставник), 115thx
Активность: 0.140.01
Статус: Участник

Создано: 14 апреля 2017 18:47
· Личное сообщение · #16

Попробуйте так:
Code:
  1. pFile = fopen("out.bin","wb");
  2. if(pFile!=NULL)
  3. {
  4.      fwrite(Buffer , sizeof(char), BufSize, pFile);
  5.      fclose(pFile);
  6. }
  7. else
  8. {
  9.      MessageBoxA(0,"error fopen",0, MB_OK|MB_ICONERROR);
  10. }


-----
все багрепорты - в личные сообщения




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

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

Какой-то "злой рок" вот код:
Code:
  1. //---------------------------------------------------------------------------
  2.  
  3. #include <vcl.h>
  4. #include <stdio.h>
  5. #include <windows.h>
  6. #include <string.h>
  7. #pragma hdrstop
  8.  
  9. #include "Unit1.h"
  10. //---------------------------------------------------------------------------
  11. #pragma package(smart_init)
  12. #pragma resource "*.dfm"
  13. TForm1 *Form1;
  14. //---------------------------------------------------------------------------
  15. __fastcall TForm1::TForm1(TComponent* Owner)
  16.          : TForm(Owner)
  17. {
  18. }
  19. //---------------------------------------------------------------------------
  20. void __fastcall TForm1::Button1Click(TObject *Sender)
  21. {
  22. char *Text = Edit1->Text.c_str();
  23. int BufSize = Edit1->Text.Length() * 4;
  24. char *Buffer = new char(BufSize);
  25. Buffer = "\0";//наверное окончание строки не нужно?
  26. HexToBin(Text, Buffer, BufSize);
  27.  
  28. FILE *pFile;
  29.  
  30. pFile = fopen("out.bin","wb");
  31.          if(pFile!=NULL)
  32.          {
  33.                   fwrite(Buffer , sizeof(char), BufSize, pFile);
  34.                   fclose(pFile);
  35.          }
  36.          else
  37.          {
  38.                   MessageBoxA(0,"error fopen",0, MB_OK|MB_ICONERROR);
  39.          }
  40.  
  41.  
  42. }
  43. //---------------------------------------------------------------------------
  44. вываливается access
  45. приложил в архиве


9e7d_14.04.2017_EXELAB.rU.tgz - Безымянный.zip



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

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

.. ну так ставится брейкпоинт и медленно анализируются параметры и их значения на каждом шаге ..
Другого пока не придумали

Это же относится и к следующему посту.



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

Создано: 14 апреля 2017 19:37
· Личное сообщение · #19

и ещё, запустил в 6 builde're всё без ошибок, но файл получился совсем не то.
во вложении

15dc_14.04.2017_EXELAB.rU.tgz - out.bin



Ранг: 42.3 (посетитель), 19thx
Активность: 0.040
Статус: Участник

Создано: 14 апреля 2017 19:47 · Поправил: kampaster
· Личное сообщение · #20

led



Ранг: 158.4 (ветеран), 123thx
Активность: 0.140.49
Статус: Участник

Создано: 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'; же, ну (хотя он и не нужен).



Ранг: 42.3 (посетитель), 19thx
Активность: 0.040
Статус: Участник

Создано: 14 апреля 2017 20:13 · Поправил: kampaster
· Личное сообщение · #22

led



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

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

Прошу у Всех прощения за неточно поставленную задачу.
Имеется в коде проги
Code:
  1. FILE *out;
  2. AnsiString print = "c0200000a9157af47175aa456151b46e14e8be41438aa5412caadd12ba69d4129de7e1688c1f82639688a24f1521624c1820624599a182429dc5423a6a622371940622e2546c22db26c22c296821f1b2a2179fc4620000000000000000000000000000000000000000000000000000000000000000000000000000000000002013c0c0800000a9157af47175aa456151b46e14e8be41438aa5412caadd12ba69d4129de7e1688c1f82639688a24f1521624c1820624599a182429dc5423a6a622371940622e2546c22db26c22c296821f1b2a2179fc4620000000000000000000000000000000000000000000000000000000000000000000000000000000000002019c0";//длина и значения меняются
  3.  
  4. out = fopen("out.bin", "wb");
  5. тут преобразование и
  6. далее на выходе получаем бинарник
  7. fclose(out);

Как применить предложенный вариант dosprog к моей задаче?
Code:
  1. int
  2. a2b(int a)
  3. {
  4. int b = a & 0xFF;
  5. if (b<0x30) b=0; else
  6. if (b<0x3A) b=b-0x30; else
  7. if (b<0x41) b=0; else
  8. if (b<0x47) b=b-0x37; else
  9. if (b<0x61) b=0; else
  10. if (b<0x67) b=b-0x57; else b=0;
  11. return(b);
  12. }

Code:
  1.    while (1)
  2.    {
  3.  
  4.       if(feof(fpin)    ) break;
  5.  
  6.       inpc = fgetc(fpin);
  7.       if( !inpc ) break;
  8.       inpc = a2b(inpc) ;
  9.       b = (unsigned char) inpc <<4 ;
  10.  
  11.       if(feof(fpin)    ) break;
  12.  
  13.       inpc = fgetc(fpin);
  14.       if( !inpc ) break;
  15.       inpc = a2b(inpc) ;
  16.       b += (unsigned char) inpc;
  17.  
  18.       fwrite (&b, 1, 1, fpout);
  19.    }


Предложенные исходники, сам поправить не могу
ещё раз извиняюсь



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

Создано: 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);





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

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

dosprog пишет:
Так в чём проблемы, - учитывая выложенную выше программку с процедурой c2b(int),
берём и пишем что-то типа такого:

щас попробую
......
Code:
  1. void __fastcall TForm1::Button1Click(TObject *Sender)
  2. {
  3. FILE *out;
  4. AnsiString print = "c0200.....
  5.  
  6. out = fopen("out.bin", "wb");
  7. int n;
  8. int i; n = print.Length()/2*2;
  9. unsigned int cinp;
  10. unsigned char b;
  11. char* pOutBin = new char(n/2 +1);
  12. for(i=0;i<n;i++)
  13. {
  14. cinp=a2b((unsigned int)print[i]); b=(unsigned char)cinp<<4;
  15. cinp=a2b((unsigned int)print[i+1]); b+=(unsigned char)cinp;
  16. i++;
  17. *pOutBin[i/2]=b;//тут ругается на
  18. //[BCC32 Error] Unit1.cpp(55): E2062 Invalid indirection
  19.  
  20. }
  21. fwrite (&pOutBin, 1, 1, out);//тут незнаю...
  22. //////// write to out file (n/2) bytes from pOutBin
  23. }
  24.  
  25. }




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

Создано: 14 апреля 2017 23:02
· Личное сообщение · #26

Поправил. --> Link <--




Ранг: 756.3 (! !), 113thx
Активность: 0.610.05
Статус: Участник
Student

Создано: 14 апреля 2017 23:05
· Личное сообщение · #27

шутники блин, как вы из этого раздули такую тему?

-----
z+Dw7uLu5+jqLCDq7vLu8PvpIPHs7uMh




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

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

Та да, тема достойна програмисского форума на басике


--Добавлено--
К следующему посту:

Rio пишет:
всё нормально, но не сходится с оригинальным файлом:


Потому что данные надо заполнять аккуратно. Например вот так:

char print[] =
"C0020000000000A917728DA4416A93E3C166A0A38160A705C15CAC09015B93E581560B8F"
"E153339E0151A1EB8145B4DDA1438C2741411868C11A0D9221140FA9610E9A15A16D1DA2"
"025A2E2042503585425010A6224C2F876238A482E22EAAC4E21718AB8200000000000000"
"000000000000000000000000000000000000000000000000000000000000000000000000"
"0000000000000000000000000000000000000000000000000000000000000000002697C0"
"C0080000000000A917728DA4416A93E3C166A0A38160A705C15CAC09015B93E581560B8F"
"E153339E0151A1EB8145B4DDA1438C2741411868C11A0D9221140FA9610E9A15A16D1DA2"
"025A2E2042503585425010A6224C2F876238A482E22EAAC4E21718AB8200000000000000"
"000000000000000000000000000000000000000000000000000000000000000000000000"
"000000000000000000000000000000000000000000000000000000000000000000269DC0";

Тогда сойдётся.





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

Создано: 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"


вот и проблема...
нельзя ли исправить Ваш алгоритм?



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

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

Что значит - "изначально"?
Может, изначально там текст был покуёвженный или что ещё.
Сейчас нормально конвертится текст 720 байтов в bin 720/2=360 байтов.
Какие проблемы?

Вон были изначально файлы: --> Link <--, на них и ориентируйтесь.




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