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

回答編集履歴

1

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

2017/02/01 03:00

投稿

Chironian
Chironian

スコア23274

answer CHANGED
@@ -13,8 +13,8 @@
13
13
  for (std::size_t i=0; i < len; ++i)
14
14
  {
15
15
  if (i) std::cout << ", ";
16
- std::cout << std::hex << std::setfill('0') << std::setw(8)
16
+ std::cout << "0x" << std::hex << std::setfill('0') << std::setw(8)
17
- << "0x" << buf[i];
17
+ << buf[i];
18
18
  }
19
19
  }
20
20
 
@@ -50,4 +50,59 @@
50
50
 
51
51
  バッファの組み立てはstd::vectorを使ってみました。効率は悪いですが、お手軽です。
52
52
 
53
- sendData()でデバック用に0x付きの16進数表現で表示してみました。これは人が目で見て分かりやすいようにするためです。[マニュピュレータ](http://qiita.com/katabamisan/items/5c9600e839d1d6ef4d62)を使ってます。
53
+ sendData()でデバック用に0x付きの16進数表現で表示してみました。これは人が目で見て分かりやすいようにするためです。[マニュピュレータ](http://qiita.com/katabamisan/items/5c9600e839d1d6ef4d62)を使ってます。
54
+
55
+ ---
56
+ 【追加】
57
+ コメントにも書きましたが、数値表現については[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)等の記事を参考にされて下さい。
58
+ 文字列からの変換サンプル・ソースはググってみたけど標準ライブラリを使わないケースを見つけることができませんでした。アルゴリズムを提示しているサイトは、数学的(文字列と数値を区別しない)に書いているところばかりでしたので、更に混乱しそうです。
59
+
60
+ 簡単ですの書いてみました。エラー処理をほとんどしていませんので、想定外の文字列がdata1に入っているとエラーにならずに誤動作します。
61
+
62
+ ```C++
63
+ void sendData(unsigned int buf[], int len, int hz);
64
+
65
+ int main()
66
+ {
67
+ char data1[20] = "123,456,789";
68
+ unsigned int buf[100];
69
+
70
+ int index=0;
71
+ buf[index]=0;
72
+ for (char* p=data1; *p != 0; ++p)
73
+ {
74
+ if (*p == ',')
75
+ {
76
+ ++index;
77
+ buf[index]=0;
78
+ continue;
79
+ }
80
+ else if ((*p < '0') || ('9' < *p))
81
+ continue;
82
+
83
+ buf[index] *= 10;
84
+ buf[index] += *p-'0';
85
+ }
86
+
87
+ sendData(buf, index+1, 38);
88
+
89
+ return 0;
90
+ }
91
+
92
+ #include <iostream>
93
+ #include <iomanip>
94
+
95
+ void sendData(unsigned int buf[], int len, int hz)
96
+ {
97
+ for (std::size_t i=0; i < len; ++i)
98
+ {
99
+ if (i) std::cout << ", ";
100
+ std::cout << "0x" << std::hex << std::setfill('0') << std::setw(4)
101
+ << buf[i];
102
+ }
103
+ }
104
+ ```
105
+
106
+ EEPROMへ書き込むフォーマットに"0x"が追加されてますね。面倒なのでそれには対応していません。ご自身で改造されてみて下さい。
107
+
108
+ しかし、EEPROMへ書き込むフォーマットを選択できるのでしたら、最初からunsigned int buf[SIZE];形式で書いておけば楽と思います。