質問編集履歴

3

元データの間違い

2021/10/19 07:24

投稿

homepage1031
homepage1031

スコア15

test CHANGED
File without changes
test CHANGED
@@ -100,7 +100,7 @@
100
100
 
101
101
  ただし、変換後、出力先データ長より大きくなる場合は下の桁は切り捨てます。
102
102
 
103
- 01h,02h,11h(17),22h(18) → 1021718(F9716h) → 0Fh,97h,16h
103
+ 01h,02h,11h(17),12h(18) → 1021718(F9716h) → 0Fh,97h,16h
104
104
 
105
105
 
106
106
 

2

データ変換の間違い

2021/10/19 07:24

投稿

homepage1031
homepage1031

スコア15

test CHANGED
File without changes
test CHANGED
@@ -64,7 +64,7 @@
64
64
 
65
65
  実際の入出力例では
66
66
 
67
- 入力で01h,02h,11h(17),22h(18)が来た場合、
67
+ 入力で01h,02h,11h(17),12h(18)が来た場合、
68
68
 
69
69
  10進数で1021718(F9716h)とし、このデータをバイト毎に区切って
70
70
 

1

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

2021/10/19 07:23

投稿

homepage1031
homepage1031

スコア15

test CHANGED
File without changes
test CHANGED
@@ -4,25 +4,11 @@
4
4
 
5
5
 
6
6
 
7
- 入力として9バイトまでのバイト配列があり、
8
-
9
- (何故そんな変換をするのかは分からないのですが)
10
-
11
- これを10進数の9桁の整数値に変換する関数を作りたいです。
12
-
13
-
14
-
15
- 入力で01h,02h,11h,22hが来た場合、
16
-
17
- 10進数で1021122と見なし、
18
-
19
- 変換後の配列は00h,0Fh,97h,16hになるような変換です。
20
-
21
-
22
-
23
- long longが使える元ソースだと
7
+ long longが使える元々実装されている以下のソースを、long longが実装されていない処理系に移植する必要があります。
24
8
 
25
9
  ```C
10
+
11
+ #define HUNDREDKETA 9
26
12
 
27
13
  const QWORD hundredk[HUNDREDKETA] = { 1L, // 0: 1の位
28
14
 
@@ -74,15 +60,63 @@
74
60
 
75
61
  }
76
62
 
63
+ ```
64
+
65
+ 実際の入出力例では
66
+
67
+ 入力で01h,02h,11h(17),22h(18)が来た場合、
68
+
69
+ 10進数で1021718(F9716h)とし、このデータをバイト毎に区切って
70
+
71
+ 変換後の配列は0Fh,97h,16hになるような変換です。
77
72
 
78
73
 
79
74
 
75
+ ■上記から理解した仕様
80
76
 
81
- ```
77
+ 上記のソースと入出力例、及び、呼び出し元から以下の仕様になっていると思います。
82
78
 
83
- こんな感じで実装されています。
84
79
 
80
+
81
+ 引数として以下を受け取ります。
82
+
83
+ ・*outd・・・出力先のバッファのポインタ
84
+
85
+ ・outlen・・・上記バイト配列のデータ長 (1 ~ 64)
86
+
87
+ ・ind・・・10進数の2桁毎の数値が入っているバイト配列
88
+
89
+ ・length ・・・入力データ長 (9固定)
90
+
91
+
92
+
93
+ 入力のバイト配列を
94
+
95
+ (何故そんな変換をするのかは分からないのですが)
96
+
97
+ これを10進数の整数値が2桁毎に配列に入っているとみなし、
98
+
99
+ 10進数に変換後、再度、バイト配列に戻す関数を作りたいです。
100
+
101
+ ただし、変換後、出力先データ長より大きくなる場合は下の桁は切り捨てます。
102
+
103
+ 01h,02h,11h(17),22h(18) → 1021718(F9716h) → 0Fh,97h,16h
104
+
105
+
106
+
107
+ 入力が01h,02h,03h,04h,05h,06h,07h,08h,09h,10hとなった場合、
108
+
109
+ かつ、出力先バッファのデータ長が10、入力データ長 が9だった場合、
110
+
111
+ 9バイト以降は切り捨てるので、10203040506070809(243F9C7CFE4719h)を二桁毎に区切って
112
+
113
+ 24h,3Fh,9Ch,7Ch,FEh,47h,19hを出力先の配列の後ろに入れます。
114
+
115
+ なので、00h,00h,00h,24h,3Fh,9Ch,7Ch,FEh,47h,19hになります。
116
+
117
+
118
+
85
- ※入力桁数と出力バイト実際上位から指定され数値になり、右詰で桁あふれした場合は消える様です。
119
+ バイト配列右詰なるめ、9バイト満た場合は先頭配列には00入ります。
86
120
 
87
121
 
88
122