回答編集履歴

1

元のソース修正と追加質問への回答

2017/02/01 03:00

投稿

Chironian
Chironian

スコア23272

test CHANGED
@@ -28,9 +28,9 @@
28
28
 
29
29
  if (i) std::cout << ", ";
30
30
 
31
- std::cout << std::hex << std::setfill('0') << std::setw(8)
31
+ std::cout << "0x" << std::hex << std::setfill('0') << std::setw(8)
32
-
32
+
33
- << "0x" << buf[i];
33
+ << buf[i];
34
34
 
35
35
  }
36
36
 
@@ -103,3 +103,113 @@
103
103
 
104
104
 
105
105
  sendData()でデバック用に0x付きの16進数表現で表示してみました。これは人が目で見て分かりやすいようにするためです。[マニュピュレータ](http://qiita.com/katabamisan/items/5c9600e839d1d6ef4d62)を使ってます。
106
+
107
+
108
+
109
+ ---
110
+
111
+ 【追加】
112
+
113
+ コメントにも書きましたが、数値表現については[Wikipedia](https://ja.wikipedia.org/wiki/%E3%82%B3%E3%83%B3%E3%83%94%E3%83%A5%E3%83%BC%E3%82%BF%E3%81%AE%E6%95%B0%E5%80%A4%E8%A1%A8%E7%8F%BE)等の記事を参考にされて下さい。
114
+
115
+ 文字列からの変換サンプル・ソースはググってみたけど標準ライブラリを使わないケースを見つけることができませんでした。アルゴリズムを提示しているサイトは、数学的(文字列と数値を区別しない)に書いているところばかりでしたので、更に混乱しそうです。
116
+
117
+
118
+
119
+ 簡単ですの書いてみました。エラー処理をほとんどしていませんので、想定外の文字列がdata1に入っているとエラーにならずに誤動作します。
120
+
121
+
122
+
123
+ ```C++
124
+
125
+ void sendData(unsigned int buf[], int len, int hz);
126
+
127
+
128
+
129
+ int main()
130
+
131
+ {
132
+
133
+ char data1[20] = "123,456,789";
134
+
135
+ unsigned int buf[100];
136
+
137
+
138
+
139
+ int index=0;
140
+
141
+ buf[index]=0;
142
+
143
+ for (char* p=data1; *p != 0; ++p)
144
+
145
+ {
146
+
147
+ if (*p == ',')
148
+
149
+ {
150
+
151
+ ++index;
152
+
153
+ buf[index]=0;
154
+
155
+ continue;
156
+
157
+ }
158
+
159
+ else if ((*p < '0') || ('9' < *p))
160
+
161
+ continue;
162
+
163
+
164
+
165
+ buf[index] *= 10;
166
+
167
+ buf[index] += *p-'0';
168
+
169
+ }
170
+
171
+
172
+
173
+ sendData(buf, index+1, 38);
174
+
175
+
176
+
177
+ return 0;
178
+
179
+ }
180
+
181
+
182
+
183
+ #include <iostream>
184
+
185
+ #include <iomanip>
186
+
187
+
188
+
189
+ void sendData(unsigned int buf[], int len, int hz)
190
+
191
+ {
192
+
193
+ for (std::size_t i=0; i < len; ++i)
194
+
195
+ {
196
+
197
+ if (i) std::cout << ", ";
198
+
199
+ std::cout << "0x" << std::hex << std::setfill('0') << std::setw(4)
200
+
201
+ << buf[i];
202
+
203
+ }
204
+
205
+ }
206
+
207
+ ```
208
+
209
+
210
+
211
+ EEPROMへ書き込むフォーマットに"0x"が追加されてますね。面倒なのでそれには対応していません。ご自身で改造されてみて下さい。
212
+
213
+
214
+
215
+ しかし、EEPROMへ書き込むフォーマットを選択できるのでしたら、最初からunsigned int buf[SIZE];形式で書いておけば楽と思います。