質問をすることでしか得られない、回答やアドバイスがある。

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

新規登録して質問してみよう
ただいま回答率
85.35%
C++

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

Q&A

解決済

1回答

3745閲覧

C++でBYTEの入ったvectorを出力する方法を教えてください

退会済みユーザー

退会済みユーザー

総合スコア0

C++

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

0グッド

0クリップ

投稿2020/05/27 00:17

#なぜ知りたいか
僕が書いたコードがめちゃくちゃバグってるようなのですが、vectorの中身を見ないと何がどうバグってるのかわからないからです

#何をやっているか
こんなvectorがあるとします。

cpp

1std::vector<BYTE> jmp_inst = { 2 0xFF, 0x25, 0x00, 0x00, 0x00, 0x00, 3 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 4 };

これの7要素目から先(2行目)をmemcpyを使って別の値に上書きします。

cpp

1memcpy(&jmp_instr[6], &newMemory, 8)

(まずこの時点であってるか不安ですが)
ちなみにnewMemoryとは、VirtualAlloc関数の戻り値で、型はvoid*です。

#出力できない

とりあえずmemcpyをする前のもともとのvectorを出力しようと試みたのですが、Visual Studio上でエラーが発生しました。

cpp

1#include <iostream> 2#include <windows.h> 3#include <vector> 4 5std::vector<BYTE> jmp_inst = { 6 0xFF, 0x25, 0x00, 0x00, 0x00, 0x00, 7 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 8 }; 9 10//例1 11for (auto a : jmp_inst) { 12 std::cout << a << std::endl; 13 } 14 15//例2 16for (std::vector<BYTE>::const_iterator i = path.begin(); i != path.end(); ++i) { 17 std::cout << *i << ' '; 18}

エラー

どうしたら中身の値を確認できますでしょうか?
バイト配列なのでできれば16進数で出力したいです。

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

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

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

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

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

dodox86

2020/05/27 00:54

全体的なコードの良し悪しは置いておいて、memcpy関数の引数並びは memcpy(コピー先のメモリ位置を指すポインタ, コピー元のメモリ位置を指すポインタ, コピーするバイト数)です。その意識は合っていますでしょうか。 https://ja.cppreference.com/w/cpp/string/byte/memcpy
退会済みユーザー

退会済みユーザー

2020/05/27 00:59

「第一引数のアドレスに、第二引数の値を第三引数のバイト数だけコピーする」という粗い認識ですが、一応間違ってはないですか...? memcpyは配列などに値をコピーするのに使えるようなのでそういう意味で使ってるつもりなんです
dodox86

2020/05/27 01:07 編集

提示されているコードが > memcpy(&jmp_instr[6], &newMemory, 8) となっていて、更にその上の提示コード、 std::vector<BYTE> imp_inst がコピー元としたいソースデータのように見受けられ、 newMemoryからimp_instr[6]から始まるアドレスへ8バイトコピー、と言うような呼び出しになって、それは逆じゃないのか?と思ったので指摘した限りです。(jmp_instrと jmp_inst でスペルが違いますが) 質問者さんの意図通りであれば特にそれ以上、コメントはないです。
guest

回答1

0

ベストアンサー

main関数の中に書いていますか?

中の値はstd::bitsetを用いると確認できるかなと思います。
参考:https://cpprefjp.github.io/reference/bitset/bitset.html

あっ、16進数で確認したいのですね、すみません。

cpp

1std::cout << std::hex << (int)a << std::endl;

でいかがでしょうか。

投稿2020/05/27 00:48

編集2020/05/27 01:04
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

退会済みユーザー

退会済みユーザー

2020/05/27 01:23

ありがとうございます!!ちゃんと確認できました!! BYTEを直接出力するのではなくてintにキャストしてからするんですね!? C++はキャスト地獄なのでほんと難しいです...
退会済みユーザー

退会済みユーザー

2020/05/27 01:37

おっ、よかったです。 BYTEは結局unsigned charなので…(確か) C++らしくキャストするならこのキャストはよろしくないですけどね。static_castとかで調べてみてください。 難しさはよくわかります。
退会済みユーザー

退会済みユーザー

2020/05/27 02:09

確かに今定義見たらunsigned charって書いてありました! なるほど、ありがとうございます!! 調べてみます...
退会済みユーザー

退会済みユーザー

2020/05/27 02:09

解決したのであれば解決済にしてくださいね。 他の回答者の方が未解決だと勘違いしますので…
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問