質問編集履歴
1
書式の改善
test
CHANGED
File without changes
|
test
CHANGED
@@ -1,8 +1,8 @@
|
|
1
1
|
### 前提・実現したいこと
|
2
2
|
|
3
|
-
string型の16進数文字列
|
3
|
+
string型の16進数文字列から
|
4
4
|
|
5
|
-
char *型の文字列
|
5
|
+
char *型の文字列へと変換を行いたいです。
|
6
6
|
|
7
7
|
|
8
8
|
|
@@ -12,7 +12,35 @@
|
|
12
12
|
|
13
13
|
```
|
14
14
|
|
15
|
+
string型16進文字列 → string型文字列 → char *型文字列
|
16
|
+
|
17
|
+
と変換を行うプログラムを作成しました。
|
18
|
+
|
19
|
+
|
20
|
+
|
21
|
+
"Hello, world!"等の簡易な文字列でテストを行った際は正しく変換が行えましたが、
|
22
|
+
|
23
|
+
ソースコードに記入してあるような文字列に対して変換を行おうとすると、上手く変換が出来ませんでした。
|
24
|
+
|
25
|
+
(printしてみると期待通りの文字列が表示されない)
|
26
|
+
|
27
|
+
|
28
|
+
|
29
|
+
※下記ソースコードの "string hex" を"48656c6c6f2c20776f726c6421"("Hello world!"の16進数表記)として
|
30
|
+
|
31
|
+
実行すると成功正しく表示されることは確認済です。
|
32
|
+
|
33
|
+
|
34
|
+
|
35
|
+
こちらに関しましてお力添え頂けますと幸いです。
|
36
|
+
|
37
|
+
|
38
|
+
|
39
|
+
その他必要な情報等ございましたらご指示下さいませ。
|
40
|
+
|
41
|
+
|
42
|
+
|
15
|
-
|
43
|
+
よろしくお願いいたします。
|
16
44
|
|
17
45
|
```
|
18
46
|
|
@@ -24,21 +52,33 @@
|
|
24
52
|
|
25
53
|
```c++
|
26
54
|
|
55
|
+
#include <iostream>
|
56
|
+
|
57
|
+
#include <string>
|
58
|
+
|
59
|
+
#include <cstring>
|
60
|
+
|
61
|
+
|
62
|
+
|
63
|
+
using namespace std;
|
64
|
+
|
65
|
+
|
66
|
+
|
27
67
|
void hex2stream(const std::string hexstr, std::string& str)
|
28
68
|
|
29
69
|
{
|
30
70
|
|
31
|
-
|
71
|
+
str.resize((hexstr.size() + 1) / 2);
|
32
72
|
|
73
|
+
|
33
74
|
|
34
|
-
|
35
|
-
|
75
|
+
for (size_t i = 0, j = 0; i < str.size(); i++, j++)
|
36
76
|
|
37
77
|
{
|
38
78
|
|
39
|
-
|
79
|
+
str[i] = (hexstr[j] & '@' ? hexstr[j] + 9 : hexstr[j]) << 4, j++;
|
40
80
|
|
41
|
-
|
81
|
+
str[i] |= (hexstr[j] & '@' ? hexstr[j] + 9 : hexstr[j]) & 0xF;
|
42
82
|
|
43
83
|
}
|
44
84
|
|
@@ -48,30 +88,34 @@
|
|
48
88
|
|
49
89
|
int main(){
|
50
90
|
|
51
|
-
string hex = "48656c6c6f2c20776f726c6421";
|
91
|
+
string hex = "1f8b0800000000000003ad1a6d73da46fabb7fc55abd8bc41924ecb41f0ac69ec4715bcf248dcf71ae7383a9679156a05848747731e652fff77bf6552b21883b77cc18d0eeb3cffbebe2d3c3771f2f6eff7d7d897eb9fdf01e5d7f7efbfeea0279bd28faedf54514bdbb7da736be0ffbc7e896e282653c2b0b9c47d1e5af1ef2e69c2f0751b45eafc3f5ebb0a4b3e8f6269af345fe7d9497252361c213efece0542c890f8213f858108e51811764e4d1725a72e6a1b82c3829f8c82bcaac48c853b728d332cfcbb5381de973d332d920c637391c9ce2f86146cb5591f4e2322fe90071c1de12534033444b9c2459311ba0fef269881698ceb2423f70f2c47b38cf66b0100330a1432072709a648f06b982efe524e5038457bc34287a349bcdcd9a3d9525236f8313d65bd25e8ea724f70ca214c4eaa57891e59b01f23f7c42d73f977c9ec57e9701b33d4668960e918462d97fc8001d9f0816b544dffd205f43342792ecf10f6233cf0ad2abad948f84a6a0abc13c4b12520c5192b1658e3783a22c08b0797d731a019f825d16d36cc911df2c813ba189e80b7ec46a15e44957452c0c8c088bf1927ce214941864c53de3b483be1e2044095fd102a9a59012a01393203a8d665de4bdcaf9d0eb0054ed55419d29a8d97e284f41fdb12af7c3f90aeebbd73f02d8f0e0f9a0623f639f56d377e5026785e03e9e93f8a12b98e674c5b892e41153c4d1c8ae86a0b38c077ee80332b51dab6d79bcb19da528e0614e8a199fa33314ebaf0ab555538a734604f833fca5254581409b01dafe103e4e9141014f4747e6b0c43db6d87be818feb2093a1ca1781c3797cda96da28aec73653590936c290aa7e433cd859a5634af544394ecb066248f2ac9c9b83f0965a07e4c037fe07740057d97fd0684c81300341a09a83fff44dbbbcc6e1b69049a43323e71046c175289285e82eff53ce324cf9830edd89ef337785e96615c865f96be5e9d98e36d86b168da0c64d873dd4c70daad8e8dc13075c61b56308bcf0d195a8c88087cff96955da06def736d0e3992917fae08dd6c191d0e820abe3e9b00e08be5961b9c3b01b0581a6f04df3c69383f7c28e21a19d0c50b06f8e0d8f87862f0bd52f8da8ca04eb4594000a679f22f9c03b402038d1b9423855231a9c00c9fe063c7b58819ab7d70c809a0f2fd5d3aafc3d5f2e31a3cb95c870989cb847cbeb9ba28174bc8bc05d7b441d84ea73520a58a4041429cd99be4020a0185b247a8b0028095d32f0c0dd078d2156770f1000f7df17d0a24e1bbb16910e33c1725b18b18c9d36616325095e0063ec4cb65be09c4a12e8212b75a00dbcc302bcd27c865ec2dc150a32151385451cd7f8c0701ebd1ef818ce9f341e7fc2eba8b44719c4a0477a10cc43b88c43b08c5bb285b2c5934acbb4dc809e306b7e5212f71a2b87005afe54ca86a651a408165a1d0dc587e136a9bc8e4e241b74052289f892792900dc14309e7c8d88a22cca692a166be3586b52ac81633d04152c65299614c09e6e43227e229f0af3efc6cbd73310b191545660f3d2bff8cf0378946c35c15880a9563c67e858eca5587e5004e9a736f37174d50abf86fc0d7e9b486499542c636b9ca3a8ac15b1d9580f3a1f3fae36007f95b3c93c4bd7f789d7df95a90d897aae53ee4e6459075422b86f08a36f559bd84cb159bd70e5b2e76a66e9df774b00bd3158424b7e525c58c5cd336ef15c26c92e26a8167c4b843cdde812f62e81e60ee534876e43e13a0c691f4f15be8e7d0cb8e8bd64f9cb6ce62a83b79b2518b35817680fd7579abf0bda0a419ddb175c6e3f9350547d8a5b925bd2720a8eb61950fbddd5c254a7cdb9ebbd5e1d01c8684f017f2c7ae2420deab7cd416d5402fcd4116c0e71ffb151ecd472827875077f0a2224df3327e682f4b3bcf88c6df1fbe90c39a77069d17b0e4a0b73ece642dccd2cd07c2987063c7585f585918b4ca9e48ae85f122716b1288e611c1c74fc2493d34687a9739848e90d7f5e05d2e4897fe44e3610d1125";
|
52
92
|
|
53
|
-
string
|
93
|
+
string plane;
|
54
94
|
|
55
|
-
hex2stream(hex,)
|
95
|
+
hex2stream(hex,plane);
|
96
|
+
|
97
|
+
cout << plane << endl; // ここまでは期待通りに表示される
|
98
|
+
|
99
|
+
cout << plane.c_str() << endl; // この時点で正しく表示されない
|
100
|
+
|
101
|
+
char *cstr = new char[plane.size()+1];
|
102
|
+
|
103
|
+
strcpy(cstr, plane.c_str());
|
104
|
+
|
105
|
+
cout << cstr << endl; // 正しく表示されない
|
106
|
+
|
107
|
+
delete[] cstr;
|
108
|
+
|
109
|
+
}
|
56
110
|
|
57
111
|
|
58
|
-
|
59
|
-
}
|
60
112
|
|
61
113
|
```
|
62
114
|
|
63
115
|
|
64
116
|
|
65
|
-
### 試したこと
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
ここに問題に対して試したことを記載してください。
|
70
|
-
|
71
117
|
|
72
118
|
|
73
119
|
### 補足情報(FW/ツールのバージョンなど)
|
74
120
|
|
75
|
-
|
76
|
-
|
77
|
-
|
121
|
+
g++ (Ubuntu 7.5.0-3ubuntu1~18.04) 7.5.0
|