🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
C++11

C++11は2011年に容認されたC++のISO標準です。以前のC++03に代わるもので、中枢の言語の変更・修正、標準ライブラリの拡張・改善を加えたものです。

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

String

Stringは、ゼロ以上の文字から連続してできた文字の集合を扱うデータ型です。基本的にテキストを表すために使われます。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

2回答

2860閲覧

【c++】string型16進数文字列をchar *型文字列に変換した際の表示に関して

96chan

総合スコア0

C++11

C++11は2011年に容認されたC++のISO標準です。以前のC++03に代わるもので、中枢の言語の変更・修正、標準ライブラリの拡張・改善を加えたものです。

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

String

Stringは、ゼロ以上の文字から連続してできた文字の集合を扱うデータ型です。基本的にテキストを表すために使われます。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2020/12/17 23:19

編集2020/12/17 23:35

前提・実現したいこと

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

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ozwk

2020/12/17 23:26

質問はなんでしょう
y_waiwai

2020/12/17 23:34

> へと変換したいです。 したいことはわかりましたが、なにをききたいんでしょうか。 また、提示のコードではどういう不具合があってそれをどうしたいのかを説明しましょう。
96chan

2020/12/17 23:37

申し訳ございません、初めての投稿で勝手がわからず、編集途中に誤って投稿を行ってしまいました。 只今修正を行いましたので再度ご確認頂けますと幸いでございます。
ozwk

2020/12/17 23:38

この質問文のコードだとなんと表示させたいんですか?
y_waiwai

2020/12/17 23:39

正しく表示されるとはどういう表示されるんでしょう。 また、正しく表示されないとはどういう表示になるんでしょうか。
96chan

2020/12/17 23:42

最終的に cstr をprintした際に、下記の文字列が表示されるようにしたいです。 (バイナリ列のため私の環境で文字化けした状態のものをそのままコピペしております) �ms�F���Z���$�� ƞ�q[�$��q�s��g�V�XHtw1�R��{�U+!�;w����������w/n�}}�~���]~���y�(���E��}�6�������e<+ �G������/Q�^���밤���&��E�}��%#a����T,���X�Q�d��rZr桸,8)��+ʬH�S�(�2�˵8�s�2� �79���aF�U���2/�q��S@3DK�$Y1���i��βB?p��{8�f�0�C rp�d�����$��W�4(z4��͚=�%#o��[�^��$� ����x����?|B�?�|��~��=Fh���b���D�� _C4'���b3� ҫ��������<KR Q��e�7���y}s��]�l��,�;��� ~�j�IWE, ���|��d�=㴃� D _������ :�f]������T�UA�)��~(OA��*��� ���?�����b?c�V�w�g��>����+��tŸ��S��Ȯ����~�2��my����(�aN���3�� �US�sF�3��%E�@���>N�AOGG���=��{��� :�x7�ͩm���se5��l) ��3ͅ�V4�TC���f$�*�ɸ? e�~L�w@}����4 �?�Dۻ�ni�C2>qlR�(^���<�$Ϙ0�؞�7x^�a\�_��^���m��h� Z�|���]�m�sm9���l� d�s�Lpڭ���0u�0�� �>������;�Xo�<i8?|(��� ����xb��R�ڌ�N�Y@�y�/����#�R1�� ��cǵ��}p� ���]:�����<�\� �˄|���(Kȼ״A�N�5 ��@AB�ٛ� ��G�����/ �x�gp�}�} $ựi�<%����f2P��>��e� ġ.��Z��0+�'�e�-�P�!Q8TQ������A��.��Dq�Jw� �C ��؊"̦��f�5��*�3�AR�R�aL ��2'�)��>�l�s1 �;��Ż([,Y4��M� ���!/q��p��L�je@�e���X~j����A�@R(��'�� Ef=+���7�F�\� �c�~���U��N�so7MP��o��鴆I�B�6��:��[�������`�[<�Ľx�}�Z�ؗ��>��E�uB+���6�Y�����[.v�n��t� ��$��%Ō\�6��l��j�gĸC�ށ/b�`�SHv�>�Ƒ��[���ˎ��O���b�;y�Q�5�v��uy�????ݱu���5Gإ�%�' ��a���\%J|۞��������Ǯ$ ޫ|��@/�A��
96chan

2020/12/17 23:43

cout << plane << endl; の時点で出力された文字列と同じものが、 cout << cstr << endl; の時点で出力されることを期待しております。
episteme

2020/12/18 01:25

char*(C文字列)に変換すると,途中に現れる 0 が文字列の終端と見なされ、出力がそこまでになりますよ?
guest

回答2

0

  • char*にはデータの開始地点とデータの型(char)しか記憶されず終端がわからない
  • よって\0という終端文字を文字列の終端とみなす

以上のC言語およびC言語文字列の仕様上cout::<<printfにてそれを表示させる事やstrcpyによるコピーは不可能です。

std::fwriteを用いる方法

c++

1std::fwrite(plane.c_str(), 1, plane.size(), stdout); 2std::puts("");

cout::writeを用いる方法

c++

1cout.write(plane.c_str(), plane.size()) << endl;

投稿2020/12/18 00:02

asm

総合スコア15149

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

asm

2020/12/18 00:10

さらに言うと、標準出力がバイナリモードで開かれていない場合を考えると あなたの意図通りの表示が行われるかは微妙です。
guest

0

string hex = "1f8b08000000000000....

C言語の文字列というのは、'\0'を終端に置いた文字配列のことです。
あなたの提示したこのデータを、文字列に直すと、
"\x1f\x8b\x08"
という文字列となりますが、あなたの言う正しい変換というのはどういうものでしょうか。

投稿2020/12/17 23:43

y_waiwai

総合スコア88038

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問