前提・実現したいこと
string型の16進数文字列から
char *型の文字列へと変換を行いたいです。
発生している問題・エラーメッセージ
string型16進文字列 → string型文字列 → char *型文字列 と変換を行うプログラムを作成しました。 "Hello, world!"等の簡易な文字列でテストを行った際は正しく変換が行えましたが、 ソースコードに記入してあるような文字列に対して変換を行おうとすると、上手く変換が出来ませんでした。 (printしてみると期待通りの文字列が表示されない) ※下記ソースコードの "string hex" を"48656c6c6f2c20776f726c6421"("Hello world!"の16進数表記)として 実行すると成功正しく表示されることは確認済です。 こちらに関しましてお力添え頂けますと幸いです。 その他必要な情報等ございましたらご指示下さいませ。 よろしくお願いいたします。
該当のソースコード
c++
1#include <iostream> 2#include <string> 3#include <cstring> 4 5using namespace std; 6 7void hex2stream(const std::string hexstr, std::string& str) 8{ 9 str.resize((hexstr.size() + 1) / 2); 10 11 for (size_t i = 0, j = 0; i < str.size(); i++, j++) 12 { 13 str[i] = (hexstr[j] & '@' ? hexstr[j] + 9 : hexstr[j]) << 4, j++; 14 str[i] |= (hexstr[j] & '@' ? hexstr[j] + 9 : hexstr[j]) & 0xF; 15 } 16} 17 18int main(){ 19 string hex = "1f8b0800000000000003ad1a6d73da46fabb7fc55abd8bc41924ecb41f0ac69ec4715bcf248dcf71ae7383a9679156a05848747731e652fff77bf6552b21883b77cc18d0eeb3cffbebe2d3c3771f2f6eff7d7d897eb9fdf01e5d7f7efbfeea0279bd28faedf54514bdbb7da736be0ffbc7e896e282653c2b0b9c47d1e5af1ef2e69c2f0751b45eafc3f5ebb0a4b3e8f6269af345fe7d9497252361c213efece0542c890f8213f858108e51811764e4d1725a72e6a1b82c3829f8c82bcaac48c853b728d332cfcbb5381de973d332d920c637391c9ce2f86146cb5591f4e2322fe90071c1de12534033444b9c2459311ba0fef269881698ceb2423f70f2c47b38cf66b0100330a1432072709a648f06b982efe524e5038457bc34287a349bcdcd9a3d9525236f8313d65bd25e8ea724f70ca214c4eaa57891e59b01f23f7c42d73f977c9ec57e9701b33d4668960e918462d97fc8001d9f0816b544dffd205f43342792ecf10f6233cf0ad2abad948f84a6a0abc13c4b12520c5192b1658e3783a22c08b0797d731a019f825d16d36cc911df2c813ba189e80b7ec46a15e44957452c0c8c088bf1927ce214941864c53de3b483be1e2044095fd102a9a59012a01393203a8d665de4bdcaf9d0eb0054ed55419d29a8d97e284f41fdb12af7c3f90aeebbd73f02d8f0e0f9a0623f639f56d377e5026785e03e9e93f8a12b98e674c5b892e41153c4d1c8ae86a0b38c077ee80332b51dab6d79bcb19da528e0614e8a199fa33314ebaf0ab555538a734604f833fca5254581409b01dafe103e4e9141014f4747e6b0c43db6d87be818feb2093a1ca1781c3797cda96da28aec73653590936c290aa7e433cd859a5634af544394ecb066248f2ac9c9b83f0965a07e4c037fe07740057d97fd0684c81300341a09a83fff44dbbbcc6e1b69049a43323e71046c175289285e82eff53ce324cf9830edd89ef337785e96615c865f96be5e9d98e36d86b168da0c64d873dd4c70daad8e8dc13075c61b56308bcf0d195a8c88087cff96955da06def736d0e3992917fae08dd6c191d0e820abe3e9b00e08be5961b9c3b01b0581a6f04df3c69383f7c28e21a19d0c50b06f8e0d8f87862f0bd52f8da8ca04eb4594000a679f22f9c03b402038d1b9423855231a9c00c9fe063c7b58819ab7d70c809a0f2fd5d3aafc3d5f2e31a3cb95c870989cb847cbeb9ba28174bc8bc05d7b441d84ea73520a58a4041429cd99be4020a0185b247a8b0028095d32f0c0dd078d2156770f1000f7df17d0a24e1bbb16910e33c1725b18b18c9d36616325095e0063ec4cb65be09c4a12e8212b75a00dbcc302bcd27c865ec2dc150a32151385451cd7f8c0701ebd1ef818ce9f341e7fc2eba8b44719c4a0477a10cc43b88c43b08c5bb285b2c5934acbb4dc809e306b7e5212f71a2b87005afe54ca86a651a408165a1d0dc587e136a9bc8e4e241b74052289f892792900dc14309e7c8d88a22cca692a166be3586b52ac81633d04152c65299614c09e6e43227e229f0af3efc6cbd73310b191545660f3d2bff8cf0378946c35c15880a9563c67e858eca5587e5004e9a736f37174d50abf86fc0d7e9b486499542c636b9ca3a8ac15b1d9580f3a1f3fae36007f95b3c93c4bd7f789d7df95a90d897aae53ee4e6459075422b86f08a36f559bd84cb159bd70e5b2e76a66e9df774b00bd3158424b7e525c58c5cd336ef15c26c92e26a8167c4b843cdde812f62e81e60ee534876e43e13a0c691f4f15be8e7d0cb8e8bd64f9cb6ce62a83b79b2518b35817680fd7579abf0bda0a419ddb175c6e3f9350547d8a5b925bd2720a8eb61950fbddd5c254a7cdb9ebbd5e1d01c8684f017f2c7ae2420deab7cd416d5402fcd4116c0e71ffb151ecd472827875077f0a2224df3327e682f4b3bcf88c6df1fbe90c39a77069d17b0e4a0b73ece642dccd2cd07c2987063c7585f585918b4ca9e48ae85f122716b1288e611c1c74fc2493d34687a9739848e90d7f5e05d2e4897fe44e3610d1125"; 20 string plane; 21 hex2stream(hex,plane); 22 cout << plane << endl; // ここまでは期待通りに表示される 23 cout << plane.c_str() << endl; // この時点で正しく表示されない 24 char *cstr = new char[plane.size()+1]; 25 strcpy(cstr, plane.c_str()); 26 cout << cstr << endl; // 正しく表示されない 27 delete[] cstr; 28} 29
補足情報(FW/ツールのバージョンなど)
g++ (Ubuntu 7.5.0-3ubuntu1~18.04) 7.5.0