質問編集履歴

5

追記4

2019/08/28 06:26

投稿

kokok
kokok

スコア145

test CHANGED
File without changes
test CHANGED
@@ -56,7 +56,7 @@
56
56
 
57
57
  int oneline_data_length; //一行のデータの長さ
58
58
 
59
- char* srecord0_text; //S0に入れるテキスト
59
+ char srecord0_text[]; //S0に入れるテキスト
60
60
 
61
61
  } opts_t;
62
62
 
@@ -304,7 +304,7 @@
304
304
 
305
305
  opts.oneline_data_length = 32; //一行のデータの長さ
306
306
 
307
- opts.srecord0_text = ""; //S0に入れるテキスト
307
+ opts.srecord0_text ; //S0に入れるテキスト
308
308
 
309
309
 
310
310
 
@@ -775,3 +775,67 @@
775
775
 
776
776
 
777
777
  どこが間違ってるのかあまり理解できなかったのでアドバイス頂けると助かります。
778
+
779
+
780
+
781
+
782
+
783
+ --追記4--
784
+
785
+
786
+
787
+ コマンドラインから渡されたテキストを受け取り
788
+
789
+ 構造体で定義した  char srecord0_text[]; //S0に入れるテキスト
790
+
791
+
792
+
793
+ をmain関数で opts.srecord0_text ; //S0に入れるテキスト
794
+
795
+ 実体化して
796
+
797
+
798
+
799
+ ```c
800
+
801
+
802
+
803
+ case 't':
804
+
805
+ case'T':
806
+
807
+
808
+
809
+ if (*(argv[cnt] + 2) == '=') {
810
+
811
+ opts->srecord0_text = argv[cnt] + 3;
812
+
813
+ }
814
+
815
+ else {
816
+
817
+ opts->srecord0_text = argv[cnt] + 2;
818
+
819
+ }
820
+
821
+ break;
822
+
823
+ ```
824
+
825
+
826
+
827
+ オプションの解析で オプションがt , T だったら
828
+
829
+ テキストを  opts->srecord0_text  に格納したいのですが
830
+
831
+
832
+
833
+ E0137 式は変更可能な左辺値である必要があります bin_change_srecord
834
+
835
+
836
+
837
+ 上記のエラーが出てしまいます。
838
+
839
+
840
+
841
+ 解決出来なかったので、アドバイスお願い致します。

4

追記3

2019/08/28 06:26

投稿

kokok
kokok

スコア145

test CHANGED
File without changes
test CHANGED
@@ -1,5 +1,7 @@
1
1
  ```c
2
2
 
3
+
4
+
3
5
  #include <stdio.h>
4
6
 
5
7
  #include <stdlib.h>
@@ -44,6 +46,8 @@
44
46
 
45
47
  char help_flag;
46
48
 
49
+ char write_flag;
50
+
47
51
 
48
52
 
49
53
  int loadaddress; //ロードアドレス
@@ -60,10 +64,12 @@
60
64
 
61
65
  //プロトタイプ宣言
62
66
 
63
- analysis_binary_change_srecord(char readline[], FILE* wfile, int loadaddress, int stype, int oneline_data_length);
67
+ void analysis_binary_change_srecord(char read_oneline_data_length[], FILE* wfile, int loadaddress, int stype, int oneline_data_length,int rsize);
64
68
 
65
69
  //unsigned char srecord_change_binary(char* ascdata);
66
70
 
71
+ unsigned char srecord_change_binary(char* ascdata);
72
+
67
73
  header_output(char* srecord0_text, FILE* wfile);
68
74
 
69
75
 
@@ -94,6 +100,26 @@
94
100
 
95
101
  switch (*(argv[cnt] + 1)) {
96
102
 
103
+ case 'a':
104
+
105
+ case 'A':
106
+
107
+
108
+
109
+ if (*(argv[cnt] + 2) == '=') {
110
+
111
+ opts->loadaddress = argv[cnt] + 3;
112
+
113
+ }
114
+
115
+ else {
116
+
117
+ opts->loadaddress = argv[cnt] + 2;
118
+
119
+ }
120
+
121
+ break;
122
+
97
123
 
98
124
 
99
125
  case'r':
@@ -102,71 +128,91 @@
102
128
 
103
129
 
104
130
 
131
+ opts->write_flag = 1;
132
+
133
+ break;
134
+
135
+
136
+
137
+ case 's':
138
+
139
+ case 'S':
140
+
105
- if ((file = fopen(opts->infilename, "r")) != NULL) { //ファイルがあれば
141
+ if (*(argv[cnt] + 2) == '=') { //オプションに= があった場合
142
+
143
+
144
+
145
+ opts->stype = argv[cnt] + 3;
106
146
 
107
147
  }
108
148
 
109
- else { //ファイルがなければ
149
+ else {
110
-
150
+
111
- err |= FILE_OPEN_ERR;
151
+ opts->stype = argv[cnt] + 2;
112
152
 
113
153
  }
114
154
 
115
-
116
-
117
155
  break;
118
156
 
157
+
158
+
119
- case 's':
159
+ case 'd':
120
-
160
+
121
- case 'S':
161
+ case 'D':
122
-
123
-
124
-
162
+
125
- if (*(argv[cnt] + 2) == '=') { //オプションに= があった場合
163
+ if (*(argv[cnt] + 2) == '=') {
126
-
127
-
128
-
164
+
129
- opts->infilename = argv[cnt] + 3;
165
+ opts->oneline_data_length = argv[cnt] + 3;
130
166
 
131
167
  }
132
168
 
133
169
  else {
134
170
 
171
+
172
+
135
- opts->infilename = argv[cnt] + 2;
173
+ opts->oneline_data_length = argv[cnt] + 2;
136
174
 
137
175
  }
138
176
 
139
-
140
-
141
177
  break;
142
178
 
179
+
180
+
143
- case 'd':
181
+ case 't':
144
-
182
+
145
- case 'D':
183
+ case'T':
146
184
 
147
185
 
148
186
 
149
187
  if (*(argv[cnt] + 2) == '=') {
150
188
 
151
- opts->outfilename = argv[cnt] + 3;
189
+ opts->srecord0_text = argv[cnt] + 3;
152
190
 
153
191
  }
154
192
 
155
193
  else {
156
194
 
157
-
158
-
159
- opts->outfilename = argv[cnt] + 2;
195
+ opts->srecord0_text = argv[cnt] + 2;
160
196
 
161
197
  }
162
198
 
163
-
164
-
165
199
  break;
166
200
 
201
+
202
+
167
- case 't':
203
+ case 'z':
204
+
168
-
205
+ case 'Z':
206
+
207
+
208
+
209
+ //未実装
210
+
211
+ break;
212
+
213
+
214
+
169
- case'T':
215
+ case'?':
170
216
 
171
217
  opts->help_flag = 1;
172
218
 
@@ -176,32 +222,14 @@
176
222
 
177
223
 
178
224
 
179
- case 'z':
225
+ default: //オプションが無いとき、エラー
180
-
226
+
227
+
228
+
181
- case 'Z':
229
+ err |= OPT_ERR;
182
-
183
-
184
230
 
185
231
  break;
186
232
 
187
-
188
-
189
- case'?':
190
-
191
-
192
-
193
- break;
194
-
195
-
196
-
197
- default: //オプションが無いとき、エラー
198
-
199
-
200
-
201
- err |= OPT_ERR;
202
-
203
- break;
204
-
205
233
  }
206
234
 
207
235
  continue;
@@ -244,10 +272,12 @@
244
272
 
245
273
  opts_t opts;
246
274
 
247
- char readline[BUFFER];
275
+ char read_oneline_data_length[BUFFER];
248
276
 
249
277
  int result = 0;
250
278
 
279
+ int rsize;
280
+
251
281
 
252
282
 
253
283
  FILE* wfile;
@@ -342,235 +372,351 @@
342
372
 
343
373
 
344
374
 
375
+ if (opts.outfilename != NULL) { //コマンドラインからファイルの入力があれば
376
+
377
+
378
+
379
+ if ((file = fopen(opts.outfilename, "rb")) != NULL) { //指定した出力ファイルがあれば
380
+
381
+
382
+
383
+ fclose(file);
384
+
385
+ if (opts.write_flag == 0) { // オプション r が指定されてなければ 
386
+
387
+ fprintf(stderr, "ファイルが既に存在しています。");
388
+
389
+ return 0;
390
+
391
+ }
392
+
393
+ }
394
+
395
+
396
+
397
+ if ((wfile = fopen(opts.outfilename, "w")) == NULL) {
398
+
399
+
400
+
401
+ fprintf(stderr, "ファイルが開けませんでした");
402
+
403
+ return 0;
404
+
405
+ }
406
+
407
+ }
408
+
409
+ else {
410
+
411
+ wfile = stdout;
412
+
413
+ }
414
+
415
+
416
+
417
+ if (opts.infilename != NULL) { //コマンドラインからファイルの入力があれば
418
+
419
+
420
+
421
+ if ((file = fopen(opts.infilename, "r")) == NULL) { //ファイルがなければ
422
+
423
+
424
+
425
+ fprintf(stderr, "ファイルが開けませんでした");
426
+
427
+ return 0;
428
+
429
+ }
430
+
431
+ }
432
+
433
+ else {
434
+
435
+ file = stdin;
436
+
437
+ }
438
+
439
+
440
+
441
+ while(rsize = fread(read_oneline_data_length,1, opts.oneline_data_length,file) ){
442
+
443
+ //while (fgets(read_oneline_data_length, opts.oneline_data_length, file) != NULL) {
444
+
445
+
446
+
447
+ analysis_binary_change_srecord(read_oneline_data_length, wfile, opts.loadaddress, opts.stype, opts.oneline_data_length,rsize);
448
+
449
+
450
+
451
+ if (rsize == 0) {
452
+
453
+ break;
454
+
455
+ }
456
+
457
+ }
458
+
459
+
460
+
461
+ if (feof(file) != 0) {
462
+
463
+ fprintf(stderr, "ファイルが終端まで出力されていません");
464
+
465
+ }
466
+
467
+
468
+
469
+
470
+
471
+
472
+
473
+ if (opts.infilename != NULL) {
474
+
475
+ fclose(file); //ファイルが開かれたらクローズ
476
+
477
+ }
478
+
345
479
  if (opts.outfilename != NULL) {
346
480
 
347
- if ((wfile = fopen(opts.outfilename, "w")) != NULL) {
348
-
349
-
350
-
351
- }
352
-
353
- else {
354
-
355
-
356
-
357
- fprintf(stderr, "ファイルが開けませんでした");
358
-
359
- return 0;
360
-
361
- }
362
-
363
- }
481
+ fclose(wfile);
482
+
483
+ }
484
+
485
+ }
486
+
487
+
488
+
489
+ //バイナリからSレコード
490
+
491
+ void analysis_binary_change_srecord(char read_oneline_data_length[], FILE* wfile, int loadaddress, int stype, int oneline_data_length,int rsize) {
492
+
493
+
494
+
495
+ int cnt = 0;
496
+
497
+ int recsize; //レコード長
498
+
499
+ int addsize = 0; //アドレスの長さ
500
+
501
+ int datasize; //データの長さ
502
+
503
+ unsigned char checksum = 0;
504
+
505
+ static int row = 1;
506
+
507
+ unsigned char hex_data;
508
+
509
+ unsigned char hex_recsize;
510
+
511
+ static int address;
512
+
513
+ unsigned char hex_text_data_sum = 0;
514
+
515
+
516
+
517
+ char a;
518
+
519
+ char b;
520
+
521
+ char hex_rec_h;
522
+
523
+ char hex_rec_l;
524
+
525
+ char hex_check_sum_h;
526
+
527
+ char hex_check_sum_l;
528
+
529
+
530
+
531
+
532
+
533
+
534
+
535
+
536
+
537
+ if (row == 1) { //初回だけロードアドレス
538
+
539
+ address = loadaddress;
540
+
541
+ }
542
+
543
+
544
+
545
+ if (stype < STYPE_MAX) {
546
+
547
+
548
+
549
+ switch (stype) {
550
+
551
+
552
+
553
+ case 1:
554
+
555
+ case 9:
556
+
557
+ addsize = ADDRESSBYTE2;
558
+
559
+ break;
560
+
561
+ case 2:
562
+
563
+ case 8:
564
+
565
+ addsize = ADDRESSBYTE3;
566
+
567
+ break;
568
+
569
+ case 3:
570
+
571
+ case 7:
572
+
573
+ addsize = ADDRESSBYTE4;
574
+
575
+ break;
576
+
577
+ default:
578
+
579
+
580
+
581
+ break;
582
+
583
+
584
+
585
+ }
586
+
587
+
588
+
589
+ recsize = addsize + oneline_data_length + 1; //レコード長は取得
590
+
591
+
592
+
593
+
594
+
595
+ //fputs("S", wfile);
596
+
597
+ //fputc(stype, wfile);
598
+
599
+ //fputc("%02x", recsize,wfile);
600
+
601
+ //fputs("%02x0000", wfile);
602
+
603
+
604
+
605
+ printf("S");
606
+
607
+ printf("%d", stype);
608
+
609
+ printf("%02x", recsize);
610
+
611
+ printf("%04x", address);
612
+
613
+
614
+
615
+ for (int i = 0; i < rsize; i++) {
616
+
617
+
618
+
619
+
620
+
621
+ a = (read_oneline_data_length[i] >> 4) & 0xf; //上位ビット
622
+
623
+ b = (read_oneline_data_length[i] & 0xf); //下位ビット
624
+
625
+
626
+
627
+ hex_text_data_sum += (a + b); //データの合計
628
+
629
+
630
+
631
+
632
+
633
+ printf("%x", a);
634
+
635
+ printf("%x", b);
636
+
637
+ }
638
+
639
+
640
+
641
+ hex_rec_h = (recsize >> 4) & 0xf; // レコードサイズの上位ビット
642
+
643
+ hex_rec_l = recsize & 0xf; //レコードサイズの下位ビット
644
+
645
+
646
+
647
+ checksum = address + hex_text_data_sum + hex_rec_h + hex_rec_l; //チェックサムの計算
648
+
649
+
650
+
651
+ //hex_check_sum_h = (checksum >> 4) & 0xf; //チェックサムの上位ビット
652
+
653
+ //hex_check_sum_l = checksum & 0xf; //チェックサムの下位ビット
654
+
655
+
656
+
657
+ //printf("%x", hex_check_sum_h);
658
+
659
+ // printf("%x", hex_check_sum_l);
660
+
661
+ printf("%x",checksum);
662
+
663
+ //checksum += checksum; //チェックサムにチェックサムを足す
664
+
665
+ printf("\n");
666
+
667
+ /*if (checksum != 0xff) {
668
+
669
+ fprintf(stderr, "%d行目: チェックサムで誤りが検出されました\n", row);
670
+
671
+ }
672
+
673
+ */
674
+
675
+ }
364
676
 
365
677
  else {
366
678
 
367
-
368
-
369
- wfile = stdout;
679
+ fprintf(stderr, "stypeの指定は3までです");
370
-
680
+
371
- }
681
+ }
372
-
373
-
374
-
375
- if (opts.infilename != NULL) { //コマンドラインからファイルの入力があれば
682
+
376
-
377
-
378
-
379
- if ((file = fopen(opts.infilename, "r")) != NULL) { //ファイルがあれば
380
-
381
-
382
-
383
-
384
-
385
- }
386
-
387
- else { //ファイルがなければ
388
-
389
- fprintf(stderr, "ファイルが開けませんでした");
390
-
391
- return 0;
392
-
393
- }
394
-
395
- }
396
-
397
- else {
398
-
399
- file = stdin;
400
-
401
- }
402
-
403
-
404
-
405
- while (fgets(readline, ROWREADMAX, file) != NULL) {
406
-
407
-
408
-
409
- analysis_binary_change_srecord(readline, wfile, opts.loadaddress, opts.stype, opts.oneline_data_length);
410
-
411
-
412
-
413
- // puts(readline);
414
-
415
- }
416
-
417
-
418
-
419
- if (opts.infilename != NULL) {
420
-
421
- fclose(file); //ファイルが開かれたらクロ
683
+ address += rsize; //アドレスを一行のデタ長だけ足す
422
-
423
- }
684
+
424
-
425
- if (opts.outfilename != NULL) {
426
-
427
- fclose(wfile);
685
+ row++;
428
-
429
-
430
-
431
- }
686
+
687
+
432
688
 
433
689
  }
434
690
 
435
691
 
436
692
 
437
-
438
-
439
- //Sレコードを解析しバイナリに変換
440
-
441
- analysis_binary_change_srecord(char readline[], FILE* wfile, int loadaddress, int stype, int oneline_data_length) {
442
-
443
-
444
-
445
- int cnt = 0;
446
-
447
- int recsize; //レコード長
448
-
449
- int addsize = 0; //アドレスの長さ
450
-
451
- int datasize; //データの長さ
452
-
453
- unsigned char checksum = 0;
454
-
455
- static int row = 0;
456
-
457
- char bindata;
458
-
459
- int hex_recsize;
460
-
461
- static int address = 0;
462
-
463
- long hex_text_data_sum = 0;
464
-
465
-
466
-
467
- address = loadaddress;
468
-
469
-
470
-
471
- if (stype < STYPE_MAX) {
472
-
473
-
474
-
475
- switch (stype) {
476
-
477
-
478
-
479
- case 1:
480
-
481
- case 9:
482
-
483
- addsize = ADDRESSBYTE2;
484
-
485
- break;
486
-
487
- case 2:
488
-
489
- case 8:
490
-
491
- addsize = ADDRESSBYTE3;
492
-
493
- break;
494
-
495
- case 3:
496
-
497
- case 7:
498
-
499
- addsize = ADDRESSBYTE4;
500
-
501
- break;
502
-
503
- default:
504
-
505
-
506
-
507
- break;
508
-
509
-
510
-
511
- }
512
-
513
-
514
-
515
- recsize = addsize + oneline_data_length + 1; //レコード長は取得
516
-
517
-
518
-
519
- //hex_recsize = strtol(recsize, 0, 16); //FIXME デバッグで例外が発生した。  修正必要
520
-
521
-
522
-
523
- fputs("S", wfile);
524
-
525
- fputs(stype, wfile);
526
-
527
- fputs("%02x", recsize,wfile);
528
-
529
- fputs("%02x0000", wfile);
530
-
531
-
532
-
533
- for (int i = 0; i < oneline_data_length; i++) { //データを16進数に変換し合計する
534
-
535
- hex_text_data_sum += strtol(readline[i], 0, 16);
536
-
537
- }
538
-
539
-
540
-
541
- checksum = address + hex_text_data_sum + hex_recsize; //チェックサムの計算
542
-
543
-
544
-
545
- fputc(checksum, wfile);
546
-
547
-
548
-
549
- checksum += checksum; //チェックサムにチェックサムを足す
550
-
551
-
552
-
553
- if (checksum != 0xff) {
554
-
555
-
556
-
557
- printf("\n");
558
-
559
- fprintf(stderr, "チェックサムで誤りが検出されました");
560
-
561
- }
562
-
563
- }
564
-
565
- else {
566
-
567
- fprintf(stderr, "stypeの指定は3までです");
568
-
569
- }
693
+ /*unsigned char srecord_change_binary(char ascdata) {
694
+
695
+
696
+
697
+ unsigned char hex_H;
698
+
699
+ unsigned char hex_L;
700
+
701
+ unsigned char hex_HL;
702
+
703
+
704
+
705
+ hex_H = (ascdata >> 4) & 0xf; //上位ビット
706
+
707
+ hex_L = (ascdata & 0xf);
708
+
709
+
710
+
711
+ hex_HL = hex_H | hex_L;
712
+
713
+
714
+
715
+ return hex_HL;
570
716
 
571
717
  }
572
718
 
573
-
719
+ */
574
720
 
575
721
 
576
722
 
@@ -578,262 +724,6 @@
578
724
 
579
725
 
580
726
 
581
-
582
-
583
- hex_recsize = strtol(recsize, 0, 16);
584
-
585
-
586
-
587
- デバッグするとここで例外が発生します。
588
-
589
- recsizeは文字列ではないのでダメなのと、戻り値もlong 型なので例外が出たのだと解釈しています。(間違っていたら指摘お願いします。)
590
-
591
-
592
-
593
- やりたいことは、16進数に変換したいのですが、数値を16進数に変換して変数に格納するやり方が分からなかったのでアドバイス頂けたら助かります。
594
-
595
-
596
-
597
-
598
-
599
- ----追記---
600
-
601
-
602
-
603
- バイナリを16進数に変換して 1文字を 2文字の16進数で表現したいです。
604
-
605
- チェックサムもしたいので16進数を 合計したいのですが、なかなかうまくいきません。
606
-
607
-
608
-
609
- ```c
610
-
611
- for (int i = 0; i < oneline_data_length; i++) {
612
-
613
-
614
-
615
-
616
-
617
- printf("%02x", readline[i]);
618
-
619
-
620
-
621
- v += strtol(readline[i], NULL, 16); //デバック 例外発生
622
-
623
-
624
-
625
- }
626
-
627
-
628
-
629
- ```
630
-
631
-
632
-
633
- ---追記2---
634
-
635
- ```c
636
-
637
- /バイナリからSレコード
638
-
639
- analysis_binary_change_srecord(char readline[], FILE* wfile, int loadaddress, int stype, int oneline_data_length) {
640
-
641
-
642
-
643
- int cnt = 0;
644
-
645
- int recsize; //レコード長
646
-
647
- int addsize = 0; //アドレスの長さ
648
-
649
- int datasize; //データの長さ
650
-
651
- unsigned char checksum = 0;
652
-
653
- static int row = 1;
654
-
655
- unsigned char hex_data;
656
-
657
- int hex_recsize;
658
-
659
- static int address;
660
-
661
- int hex_text_data_sum = 0;
662
-
663
-
664
-
665
- char a;
666
-
667
- char b;
668
-
669
- char hex_rec_h;
670
-
671
- char hex_rec_l;
672
-
673
- char hex_check_sum_h;
674
-
675
- char hex_check_sum_l;
676
-
677
-
678
-
679
- if (row == 1) {
680
-
681
- address = loadaddress;
682
-
683
- }
684
-
685
-
686
-
687
- if (stype < STYPE_MAX) {
688
-
689
-
690
-
691
- switch (stype) {
692
-
693
-
694
-
695
- case 1:
696
-
697
- case 9:
698
-
699
- addsize = ADDRESSBYTE2;
700
-
701
- break;
702
-
703
- case 2:
704
-
705
- case 8:
706
-
707
- addsize = ADDRESSBYTE3;
708
-
709
- break;
710
-
711
- case 3:
712
-
713
- case 7:
714
-
715
- addsize = ADDRESSBYTE4;
716
-
717
- break;
718
-
719
- default:
720
-
721
-
722
-
723
- break;
724
-
725
- }
726
-
727
-
728
-
729
- recsize = addsize + oneline_data_length + 1; //レコード長は取得
730
-
731
-
732
-
733
-
734
-
735
- //fputs("S", wfile);
736
-
737
- //fputc(stype, wfile);
738
-
739
- //fputc("%02x", recsize,wfile);
740
-
741
- //fputs("%02x0000", wfile);
742
-
743
-
744
-
745
- printf("S");
746
-
747
- printf("%d", stype);
748
-
749
- printf("%02x", recsize);
750
-
751
- printf("%04x", address);
752
-
753
-
754
-
755
- for (int i = 0; i < oneline_data_length; i++) {
756
-
757
-
758
-
759
-
760
-
761
- a = (readline[i] >> 4) & 0xf; //上位ビット
762
-
763
- b = (readline[i] & 0xf);
764
-
765
-
766
-
767
- hex_text_data_sum += a + b;
768
-
769
- printf("%x", a);
770
-
771
- printf("%x", b);
772
-
773
-
774
-
775
- }
776
-
777
-
778
-
779
- hex_rec_h = (recsize >> 4) & 0xf;
780
-
781
- hex_rec_l = recsize & 0xf;
782
-
783
-
784
-
785
-
786
-
787
- checksum = address + hex_text_data_sum + hex_rec_h + hex_rec_l; //チェックサムの計算
788
-
789
-
790
-
791
- hex_check_sum_h = (checksum >> 4) & 0xf;
792
-
793
- hex_check_sum_l = checksum & 0xf;
794
-
795
-
796
-
797
- printf("%x", hex_check_sum_h);
798
-
799
- printf("%x",hex_check_sum_l);
800
-
801
-
802
-
803
- checksum +=checksum; //チェックサムにチェックサムを足す
804
-
805
-
806
-
807
- if (checksum != 0xff) {
808
-
809
-
810
-
811
- printf("\n");
812
-
813
- fprintf(stderr, "%d行目: チェックサムで誤りが検出されました\n",row);
814
-
815
- }
816
-
817
- }
818
-
819
- else {
820
-
821
- fprintf(stderr, "stypeの指定は3までです");
822
-
823
- }
824
-
825
- address += oneline_data_length; //アドレスを一行のデータ長だけ足す
826
-
827
- row++;
828
-
829
- printf("\n");
830
-
831
- }
832
-
833
- ```
834
-
835
-
836
-
837
727
  データは出力されているのですが、チェックサムで引っかかります。
838
728
 
839
729
 
@@ -861,3 +751,27 @@
861
751
 
862
752
 
863
753
  アドバイス頂けると助かります。
754
+
755
+
756
+
757
+
758
+
759
+ -----追記3-----
760
+
761
+
762
+
763
+ checksum = address + hex_text_data_sum + hex_rec_h + hex_rec_l; //チェックサムの計算
764
+
765
+
766
+
767
+ チェックサムの計算が正しく行えません。
768
+
769
+
770
+
771
+ 例 一行目チェックサム(現在) 8f
772
+
773
+ 正しい計算 D6
774
+
775
+
776
+
777
+ どこが間違ってるのかあまり理解できなかったのでアドバイス頂けると助かります。

3

hex_text_data_sum += a + b; //デバック 例外発生 コメント削除

2019/08/28 01:48

投稿

kokok
kokok

スコア145

test CHANGED
File without changes
test CHANGED
@@ -764,20 +764,18 @@
764
764
 
765
765
 
766
766
 
767
- hex_text_data_sum += a + b; //デバック 例外発生
767
+ hex_text_data_sum += a + b;
768
+
769
+ printf("%x", a);
770
+
771
+ printf("%x", b);
772
+
773
+
774
+
775
+ }
768
776
 
769
777
 
770
778
 
771
- printf("%x", a);
772
-
773
- printf("%x", b);
774
-
775
-
776
-
777
- }
778
-
779
-
780
-
781
779
  hex_rec_h = (recsize >> 4) & 0xf;
782
780
 
783
781
  hex_rec_l = recsize & 0xf;

2

追記部分2

2019/08/27 07:14

投稿

kokok
kokok

スコア145

test CHANGED
File without changes
test CHANGED
@@ -1,9 +1,5 @@
1
1
  ```c
2
2
 
3
-
4
-
5
-
6
-
7
3
  #include <stdio.h>
8
4
 
9
5
  #include <stdlib.h>
@@ -578,288 +574,292 @@
578
574
 
579
575
 
580
576
 
581
- //ヘッダーの出力
582
-
583
- header_output(char* srecord0_text, FILE* wfile) {
584
-
585
-
586
-
587
- int array_size; //ヘッダーテキストのサイズ
588
-
589
- int hex_loadaddress; //アドレス16進数変換
590
-
591
-
592
-
593
- int hex_srecord0_text_sum = 0; // テキスト16進数変換合計
594
-
595
- int record_length; //レコード長
596
-
597
- int checksum; //チェックサム合計
598
-
599
- int checksum_check; //チェックサムの検査
600
-
601
-
602
-
603
- array_size = sizeof(srecord0_text); //ヘッダーテキストのサイズ取得
604
-
605
- //hex_loadaddress = strtol(0000, 0, 16); //アドレス16進数に変換
606
-
607
-
608
-
609
-
610
-
611
-
612
-
613
- record_length = ADDRESSBYTE2 + array_size + CHECKSUMBYTE1; //レコード長を取得
614
-
615
-
616
-
617
- for (int i = 0; i < array_size; i++) {
618
-
619
- hex_srecord0_text_sum += strtol(srecord0_text[i], 0, 16); //ヘッダーテキストを16進数に変換して合計する
620
-
621
- }
622
-
623
-
624
-
625
- checksum = record_length + hex_srecord0_text_sum; //チェックサム取得
626
-
627
-
628
-
629
-
630
-
631
- fputs("S0%02x0000", wfile); //S0をファイルに書き込む
632
-
633
- fputc(record_length, wfile); //レコード長をファイルに書き込む
634
-
635
- fputs("%02x0000", wfile); //ロードアドレスをファイルに書き込む
636
-
637
-
638
-
639
- for (int i = 0; i < array_size; i++) {
640
-
641
- fputs(strtol(srecord0_text[i], 0, 16), wfile); //ヘッダテキストを16進数に変換してファイルに書き込む
642
-
643
- }
644
-
645
-
646
-
647
- fputc(checksum, wfile); //チェックサムをファイルに書き込む
648
-
649
-
650
-
651
- checksum_check = record_length + hex_srecord0_text_sum + checksum;
652
-
653
-
654
-
655
- if (checksum_check != 0xff) {
656
-
657
-
658
-
659
- printf("\n");
660
-
661
- fprintf(stderr, "チェックサムで誤りが検出されました");
662
-
663
-
664
-
665
- }
666
-
667
-
668
-
669
- //printhf("S0%02x0000"); //テスト出力
670
-
671
-
577
+ ```
578
+
579
+
580
+
581
+
582
+
583
+ hex_recsize = strtol(recsize, 0, 16);
584
+
585
+
586
+
587
+ デバッグするとここで例外が発生します。
588
+
589
+ recsizeは文字列ではないのでダメなのと、戻り値もlong 型なので例外が出たのだと解釈しています。(間違っていたら指摘お願いします。)
590
+
591
+
592
+
593
+ やりたいことは、16進数に変換したいですが、数値を16進数に変換して変数に格納するやり方が分からなかったのでアドバイス頂けたら助かります。
594
+
595
+
596
+
597
+
598
+
599
+ ----追記---
600
+
601
+
602
+
603
+ バイナリを16進数に変換して 1文字を 2文字の16進数で表現したいです。
604
+
605
+ チェックサムもしたいので16進数を 合計したいのですが、なかなかうまくいきません。
606
+
607
+
608
+
609
+ ```c
610
+
611
+ for (int i = 0; i < oneline_data_length; i++) {
612
+
613
+
614
+
615
+
616
+
617
+ printf("%02x", readline[i]);
618
+
619
+
620
+
621
+ v += strtol(readline[i], NULL, 16); //デバック 例外発生
622
+
623
+
624
+
625
+ }
626
+
627
+
628
+
629
+ ```
630
+
631
+
632
+
633
+ ---追記2---
634
+
635
+ ```c
636
+
637
+ /バイナリからSレコ
638
+
639
+ analysis_binary_change_srecord(char readline[], FILE* wfile, int loadaddress, int stype, int oneline_data_length) {
640
+
641
+
642
+
643
+ int cnt = 0;
644
+
645
+ int recsize; //レコード長
646
+
647
+ int addsize = 0; //アドレスの長さ
648
+
649
+ int datasize; //データの長さ
650
+
651
+ unsigned char checksum = 0;
652
+
653
+ static int row = 1;
654
+
655
+ unsigned char hex_data;
656
+
657
+ int hex_recsize;
658
+
659
+ static int address;
660
+
661
+ int hex_text_data_sum = 0;
662
+
663
+
664
+
665
+ char a;
666
+
667
+ char b;
668
+
669
+ char hex_rec_h;
670
+
671
+ char hex_rec_l;
672
+
673
+ char hex_check_sum_h;
674
+
675
+ char hex_check_sum_l;
676
+
677
+
678
+
679
+ if (row == 1) {
680
+
681
+ address = loadaddress;
682
+
683
+ }
684
+
685
+
686
+
687
+ if (stype < STYPE_MAX) {
688
+
689
+
690
+
691
+ switch (stype) {
692
+
693
+
694
+
695
+ case 1:
696
+
697
+ case 9:
698
+
699
+ addsize = ADDRESSBYTE2;
700
+
701
+ break;
702
+
703
+ case 2:
704
+
705
+ case 8:
706
+
707
+ addsize = ADDRESSBYTE3;
708
+
709
+ break;
710
+
711
+ case 3:
712
+
713
+ case 7:
714
+
715
+ addsize = ADDRESSBYTE4;
716
+
717
+ break;
718
+
719
+ default:
720
+
721
+
722
+
723
+ break;
724
+
725
+ }
726
+
727
+
728
+
729
+ recsize = addsize + oneline_data_length + 1; //レコード長は取得
730
+
731
+
732
+
733
+
734
+
735
+ //fputs("S", wfile);
736
+
737
+ //fputc(stype, wfile);
738
+
739
+ //fputc("%02x", recsize,wfile);
740
+
741
+ //fputs("%02x0000", wfile);
742
+
743
+
744
+
745
+ printf("S");
746
+
747
+ printf("%d", stype);
748
+
749
+ printf("%02x", recsize);
750
+
751
+ printf("%04x", address);
752
+
753
+
754
+
755
+ for (int i = 0; i < oneline_data_length; i++) {
756
+
757
+
758
+
759
+
760
+
761
+ a = (readline[i] >> 4) & 0xf; //上位ビット
762
+
763
+ b = (readline[i] & 0xf);
764
+
765
+
766
+
767
+ hex_text_data_sum += a + b; //デバック 例外発生
768
+
769
+
770
+
771
+ printf("%x", a);
772
+
773
+ printf("%x", b);
774
+
775
+
776
+
777
+ }
778
+
779
+
780
+
781
+ hex_rec_h = (recsize >> 4) & 0xf;
782
+
783
+ hex_rec_l = recsize & 0xf;
784
+
785
+
786
+
787
+
788
+
789
+ checksum = address + hex_text_data_sum + hex_rec_h + hex_rec_l; //チェックサムの計算
790
+
791
+
792
+
793
+ hex_check_sum_h = (checksum >> 4) & 0xf;
794
+
795
+ hex_check_sum_l = checksum & 0xf;
796
+
797
+
798
+
799
+ printf("%x", hex_check_sum_h);
800
+
801
+ printf("%x",hex_check_sum_l);
802
+
803
+
804
+
805
+ checksum +=checksum; //チェックサムにチェックサムを足す
806
+
807
+
808
+
809
+ if (checksum != 0xff) {
810
+
811
+
812
+
813
+ printf("\n");
814
+
815
+ fprintf(stderr, "%d行目: チェックサムで誤りが検出されました\n",row);
816
+
817
+ }
818
+
819
+ }
820
+
821
+ else {
822
+
823
+ fprintf(stderr, "stypeの指定は3までです");
824
+
825
+ }
826
+
827
+ address += oneline_data_length; //アドレスを一行のデータ長だけ足す
828
+
829
+ row++;
830
+
831
+ printf("\n");
672
832
 
673
833
  }
674
834
 
675
-
676
-
677
-
678
-
679
- //フッターの出力
680
-
681
- footer_output(FILE* wfile, int stype) {
682
-
683
-
684
-
685
-
686
-
687
- int end_stype = 0;
688
-
689
- int hex_loadaddress; //アドレスを16進数変換
690
-
691
- int addsize;
692
-
693
- int checksum;
694
-
695
- int datasize;
696
-
697
- int hex_datasize;
698
-
699
-
700
-
701
-
702
-
703
- fputs("S", wfile);
704
-
705
-
706
-
707
- switch (stype) { //終了のstype 調べる
708
-
709
- case 1:
710
-
711
- end_stype = 9;
712
-
713
- addsize = ADDRESSBYTE2;
714
-
715
- break;
716
-
717
-
718
-
719
- case 2:
720
-
721
- end_stype = 8;
722
-
723
- addsize = ADDRESSBYTE3;
724
-
725
- break;
726
-
727
-
728
-
729
- case 3:
730
-
731
- end_stype = 7;
732
-
733
- addsize = ADDRESSBYTE4;
734
-
735
- break;
736
-
737
- default:
738
-
739
- fprintf(stderr, "stypeの指定が間違えています");
740
-
741
- exit(10);
742
-
743
- break;
744
-
745
- }
746
-
747
-
748
-
749
- fputs(end_stype, wfile); //終了のstype 書き込む
750
-
751
-
752
-
753
- fputs("%02x0000", wfile); //アドレス16進数に変換
754
-
755
-
756
-
757
- datasize = addsize + 1; //データ長
758
-
759
-
760
-
761
-
762
-
763
-
764
-
765
- hex_datasize = strtol(datasize, 0, 16);
766
-
767
-
768
-
769
- fputc(hex_datasize, wfile);
770
-
771
-
772
-
773
-
774
-
775
- fputs("S0%02x0000", wfile);
776
-
777
-
778
-
779
- checksum = hex_datasize;
780
-
781
-
782
-
783
- fputs(checksum, wfile);
784
-
785
-
786
-
787
- checksum += checksum;
788
-
789
-
790
-
791
-
792
-
793
- if (checksum != 0xff) {
794
-
795
-
796
-
797
-
798
-
799
- fprintf(stderr, "チェックサムで誤りが検出されました");
800
-
801
- }
802
-
803
-
804
-
805
- }
806
-
807
-
808
-
809
-
810
-
811
835
  ```
812
836
 
813
837
 
814
838
 
815
-
816
-
817
- hex_recsize = strtol(recsize, 0, 16);
818
-
819
-
820
-
821
- デバッグするとここで例外が発生します。
822
-
823
- recsizeは文字列ではないのでダメなのと、戻り値もlong 型なので例外が出たのだと解釈しています。(間違っていたら指摘お願いします。)
824
-
825
-
826
-
827
- やりたいことは、16進数に変換したいのですが、数値を16進数に変換して変数に格納するやり方が分からなかったのでアドバイス頂けたら助かります。
828
-
829
-
830
-
831
-
832
-
833
- ----追記---
834
-
835
-
836
-
837
-
838
-
839
- バイナリを16進数に変換して 1文字を 2文字の16進数で表現したいです。
840
-
841
- チェックサムもしたいの16進数を 合計したいのですが、なくいきません
839
+ データは出力されているのですが、チェックサムで引っかか
842
-
843
-
844
-
845
- ```c
840
+
846
-
841
+
842
+
847
- for (int i = 0; i < oneline_data_length; i++) {
843
+ (S)(stype)(レコード長)(アドレス)(データ)(チェックサム) 表示
848
-
849
-
850
-
851
-
852
-
853
- printf("%02x", readline[i]);
844
+
854
-
855
-
856
-
845
+
846
+
857
- v += strtol(readline[i], NULL, 16); //デバック 例外発生
847
+ recsize = addsize + oneline_data_length + 1; //レコード長は取得
848
+
849
+
850
+
858
-
851
+ checksum = address + hex_text_data_sum + hex_rec_h + hex_rec_l; //チェックサムの計算
859
-
860
-
852
+
853
+
854
+
861
- }
855
+ checksum +=checksum; //チェックサムにチェックサムを足す
856
+
857
+
858
+
859
+
860
+
862
-
861
+ チェックサムは、レコード長からチェックサムまで足して、結果が0xFFになればOK (16進数変換した値は、すべて足し算をする。)
863
-
864
-
862
+
863
+
864
+
865
- ```
865
+ アドバイス頂けると助かります。

1

追記部分

2019/08/27 07:05

投稿

kokok
kokok

スコア145

test CHANGED
File without changes
test CHANGED
@@ -825,3 +825,41 @@
825
825
 
826
826
 
827
827
  やりたいことは、16進数に変換したいのですが、数値を16進数に変換して変数に格納するやり方が分からなかったのでアドバイス頂けたら助かります。
828
+
829
+
830
+
831
+
832
+
833
+ ----追記---
834
+
835
+
836
+
837
+
838
+
839
+ バイナリを16進数に変換して 1文字を 2文字の16進数で表現したいです。
840
+
841
+ チェックサムもしたいので16進数を 合計したいのですが、なかなかうまくいきません。
842
+
843
+
844
+
845
+ ```c
846
+
847
+ for (int i = 0; i < oneline_data_length; i++) {
848
+
849
+
850
+
851
+
852
+
853
+ printf("%02x", readline[i]);
854
+
855
+
856
+
857
+ v += strtol(readline[i], NULL, 16); //デバック 例外発生
858
+
859
+
860
+
861
+ }
862
+
863
+
864
+
865
+ ```