質問するログイン新規登録

質問編集履歴

3

元データの間違い

2021/10/19 07:24

投稿

homepage1031
homepage1031

スコア15

title CHANGED
File without changes
body CHANGED
@@ -49,7 +49,7 @@
49
49
  これを10進数の整数値が2桁毎に配列に入っているとみなし、
50
50
  10進数に変換後、再度、バイト配列に戻す関数を作りたいです。
51
51
  ただし、変換後、出力先データ長より大きくなる場合は下の桁は切り捨てます。
52
- 01h,02h,11h(17),22h(18) → 1021718(F9716h) → 0Fh,97h,16h
52
+ 01h,02h,11h(17),12h(18) → 1021718(F9716h) → 0Fh,97h,16h
53
53
 
54
54
  入力が01h,02h,03h,04h,05h,06h,07h,08h,09h,10hとなった場合、
55
55
  かつ、出力先バッファのデータ長が10、入力データ長 が9だった場合、

2

データ変換の間違い

2021/10/19 07:24

投稿

homepage1031
homepage1031

スコア15

title CHANGED
File without changes
body CHANGED
@@ -31,7 +31,7 @@
31
31
  }
32
32
  ```
33
33
  実際の入出力例では
34
- 入力で01h,02h,11h(17),22h(18)が来た場合、
34
+ 入力で01h,02h,11h(17),12h(18)が来た場合、
35
35
  10進数で1021718(F9716h)とし、このデータをバイト毎に区切って
36
36
  変換後の配列は0Fh,97h,16hになるような変換です。
37
37
 

1

事前の情報とそこから理解した仕様の分離、変換の途中データの追加、切り捨て桁数の間違いの修正、切り捨て例の追加

2021/10/19 07:23

投稿

homepage1031
homepage1031

スコア15

title CHANGED
File without changes
body CHANGED
@@ -1,16 +1,9 @@
1
1
  多倍長整数の演算で悩んでいます。
2
2
  longまでしかない32bitマイコンでC言語で多倍長整数の演算を行いたいと思っています。
3
3
 
4
- 入力として9バイトまでのバイト配列があり、
5
- (何故そんな変換をするのかは分からないのですが)
6
- これを10進数の9桁の整数値に変換する関数を作りたいです。
7
-
8
- 入力で01h,02h,11h,22hが来た場合、
9
- 10進数で1021122と見なし、
10
- 変換後の配列は00h,0Fh,97h,16hになるような変換です。
11
-
12
- long longが使える元ソースだと
4
+ long longが使える元々実装されている以下のソースを、long longが実装されていない処理系に移植する必要があります。
13
5
  ```C
6
+ #define HUNDREDKETA 9
14
7
  const QWORD hundredk[HUNDREDKETA] = { 1L, // 0: 1の位
15
8
  100L, // 1: 100の位
16
9
  10000L, // 2:
@@ -36,12 +29,36 @@
36
29
  wdt >>= 8;
37
30
  }
38
31
  }
32
+ ```
33
+ 実際の入出力例では
34
+ 入力で01h,02h,11h(17),22h(18)が来た場合、
35
+ 10進数で1021718(F9716h)とし、このデータをバイト毎に区切って
36
+ 変換後の配列は0Fh,97h,16hになるような変換です。
39
37
 
38
+ ■上記から理解した仕様
39
+ 上記のソースと入出力例、及び、呼び出し元から以下の仕様になっていると思います。
40
40
 
41
- ```
42
- こんな感じで実装されます。
41
+ 引数とし以下を受け取ります。
42
+ ・*outd・・・出力先のバッファのポインタ
43
+ ・outlen・・・上記バイト配列のデータ長 (1 ~ 64)
43
- ※入力桁と出力バイト数は実際に上位から指定された数値になり、右詰で桁あふれした場合は下の桁が消え様です。
44
+ ・ind・・・10進数の2毎の数値入っていバイト配列
45
+ ・length ・・・入力データ長 (9固定)
44
46
 
47
+ 入力のバイト配列を
48
+ (何故そんな変換をするのかは分からないのですが)
49
+ これを10進数の整数値が2桁毎に配列に入っているとみなし、
50
+ 10進数に変換後、再度、バイト配列に戻す関数を作りたいです。
51
+ ただし、変換後、出力先データ長より大きくなる場合は下の桁は切り捨てます。
52
+ 01h,02h,11h(17),22h(18) → 1021718(F9716h) → 0Fh,97h,16h
53
+
54
+ 入力が01h,02h,03h,04h,05h,06h,07h,08h,09h,10hとなった場合、
55
+ かつ、出力先バッファのデータ長が10、入力データ長 が9だった場合、
56
+ 9バイト以降は切り捨てるので、10203040506070809(243F9C7CFE4719h)を二桁毎に区切って
57
+ 24h,3Fh,9Ch,7Ch,FEh,47h,19hを出力先の配列の後ろに入れます。
58
+ なので、00h,00h,00h,24h,3Fh,9Ch,7Ch,FEh,47h,19hになります。
59
+
60
+ バイト配列は右詰になるため、9バイトに満たない場合は先頭の配列には00が入ります。
61
+
45
62
  簡単に実装できるかと思ったのですが、実装しようと思ったらループが多く、
46
63
  カラツバ法を調べてみたのですが、この繰り返しに対してどう実装して良いか分かりません。
47
64
  何か良いアルゴリズムはありますでしょうか?