現在、バイナリファイルのデータから特定の番地のデータだけをテキストボックスに表示させたいというプログラムを作成しております。

特定番地は0x1F65番地~の6バイトを抜き出し、そのHEXデータをテキストボックスにそのHEXがわかるテキストデータとして表示させたいと考えているのですが、この場合どのようにコーディングしたらよいのでしょうか。


現在のプログラムは

private: System::Void button1_Click(System::Object^ sender, System::EventArgs^ e) {
//指定したファイル名でStreamReaderを設定する

try{
System::IO::StreamReader^ sr = gcnew System::IO::StreamReader("sample.bin");
//受け皿
array<wchar_t>^ buf=gcnew array<wchar_t>(6);

//先頭から0x1f63バイト動かす
sr->BaseStream->Seek(0x1f65,System::IO::SeekOrigin::Begin);

//2バイト読み込む
sr->Read(buf, 0, buf->Length);

//此処でテキストボックスに入れる
this->textBox1->Text= gcnew System::String(buf);

}
catch(System::Exception^ ex){
System::Windows::Forms::MessageBox::Show(ex->ToString());
}
//this->textBox1->Text = L"変更1";
this->textBox2->Text = L"変更2";
this->textBox3->Text = L"変更3";
}


コマンドボタンを押して、特定番地をBUFに入れた後テキストボックスに代入しています。これだとAsciiコードに準じたの文字が表示されてしまうので、そのHEX番号がわかるようにテキストボックスに入れたいとおもっています。

どうぞ、ご教授よろしくお願いいたします。

「バイナリファイルのデータから特定の番地の」の質問画像

このQ&Aに関連する最新のQ&A

A 回答 (1件)

 こんばんは。

以下で出来ませんか。

private: System::String^ ToHEXString(array<wchar_t>^% refArray)
{
//array<wchar_t>型バッファからHEXへの変換
System::String^ sHex = gcnew System::String(0, 0);
int complete = 0;
for each(wchar_t wc in refArray)
{
//HEX変換
sHex += System::String::Format("{0:X2}", int(wc));

//最後以外はカンマを付加する
if(++complete < refArray->Length)sHex += ", ";
}
return sHex;
}

private: System::Void button1_Click(System::Object^ sender, System::EventArgs^ e) {
//指定したファイル名でStreamReaderを設定する

try{
System::IO::StreamReader^ sr=gcnew System::IO::StreamReader("sample.txt");
//受け皿
array<wchar_t>^ buf=gcnew array<wchar_t>(6);

//先頭から0x1f65バイト動かす
sr->BaseStream->Seek(0x1f65,System::IO::SeekOrigin::Begin);

//6バイト読み込む
sr->Read(buf, 0, buf->Length);

//此処でテキストボックスに入れる
this->textBox1->Text=this->ToHEXString(buf);

}
catch(System::Exception^ ex){
System::Windows::Forms::MessageBox::Show(ex->ToString());
}
//this->textBox1->Text = L"変更1";
this->textBox2->Text = L"変更2";
this->textBox3->Text = L"変更3";
}
    • good
    • 0
この回答へのお礼

回答ありがとうございました。返事遅れて大変申し訳ありません。

教えていただいたとおり、プログラムしたところ、表示したい
文字が表示されました。


改めてありがとうございました。

お礼日時:2009/06/08 14:13

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

QC++ の typedef の 使い方の質問

C++のtypedefの使い方の質問ですが、typedefは、別名の定義として、知られていますが。
以下のソースの意味がよく読み取れないです。windows プログラミングとC++
が分かるかたがいれば、以下のソースの意味を教えていただきたいです。

よろしくお願いします。
typedef BOOL (WINAPI *AddAccessAllowedAceFn)(
PACL pAcl,
DWORD dwAceRevision,
DWORD AceFlags,
DWORD AccessMask,
PSID pSid
);

Aベストアンサー

関数ポインタの別名定義です。
「関数ポインタ typedef」をキーワードにWeb検索してみてください。
丁寧に解説されているサイトが見つかるでしょう。

Q”System::IO::StreamReader”ってどういう意味ですか?

Visual C++ 2008 Express Editionで、現在、600kバイト程度のバイナリファイルを読み込んで特定の番地のデータだけを取り出してそれをテキスト変換してテキストボックス内に表示させるというプログラムを作成しているのですが、このことをOKwaveでどのようにコーディングするかを教えてもらったところ、


System::IO::StreamReader^ sr=gcnew StreamReader(_T("sample.txt"));


このような文を教えてもらったのですが、全く知識がなく何をやっているのかわかりません。
”sr”というのは変数で、sample.txtからstreamReader関数でsample.txt内のデータをsr変数に
入れているという感じがしますが、”System::IO::StreamReader”とか”gcnew”とかの意味がよくわかりません。
どうかご教授お願いいたします。

Aベストアンサー

私は、C++で開発を行っているのではなくC#ですが・・・ さらに初心者ですが・・・

>System::IO::StreamReader
テキストの文字列を、指定のフォーマットなどで取り込む時に使用します。
srへ、格納した後は、自由に取り出すことができます。
(while文などを使用して、上から一行づつ取り出すなど)

>gcnew
gcnewは、初めてみたのでわかりませんが、メモリ管理周りっぽいですね。難しかったですが、リンク載せておきます。(2つ目)

参考URL:http://msdn.microsoft.com/ja-jp/library/akzyzwh9.aspx,http://loafer.jp/mixi/diary/class.xsp?2007-09-02-22-43

QC++.NET の String型の使い方

初めて質問いたします。
C++ .NET 2005 Express Beta版を入手し、Windows Formsのプログラミングを勉強してます。

TextBoxのTextに値を変数で指定したいのですがどうすれば良いのかわかりません。

  textBox1->Text = "Test";
とダイレクトに値を指定すればできるのですが、

  #include <string>
  using namespace std;
   (省略)
  string str = "Test";
  textBox1->Text = str;
は、エラーになってしまいます。

C++標準のstringクラスではなく、.NETはStringクラスがあるようですが、これの使い方がMSDN等で調べているのですが分かりません。
分かりやすいURLなどありましたら教えていただけませんか。

Aベストアンサー

textBox1->Text = new String(str.c_str());
でいけるんじゃないかなあ。
試してないのでなんですが、
C++のstringクラスからは、c_str()で、いわゆるNULL終端文字列へのポインタが得られて
.NETのStringクラスは、NULL終端文字列でのコンストラクタがありますから。

QSystem::Drawing::Color::XXXXを変数に代入可能?

連続で質問するのも申し訳ないのですが・・・

VS2005 C++ Expressを使ってWindowsフォームアプリケーションを作っています。(C++/CLI)

ボタンなどのフォームのプロパティに、色を指定するものがあると思いますが、例えばBackColorを白に変更したい場合、
this->button1->BackColor = System::Drawing::Color::White;
のように書けると思います。

この、「System::Drawing::Color::White」の部分を変数のようにして記述したいのですが、どのように宣言した型を使用すればよいのでしょうか?
例えば仮に「System::Drawing::Color::White」がString文字列であれば、
void func1(int choice){
String^ hoge;

  if(!choice){
    hoge = System::Drawing::Color::White;
  } else {
    hoge = System::Drawing::Color::Red;
  }
  this->button1->BackColor = hoge;
}
こんな風にすると、func1(0);と呼ばれるとボタンの背景が白くなり、0以外の引数だと赤くなると思います。
ですが、System::Drawing::Color::XXXはStringではないのでできません。

この場合、hogeをどのような形で定義すればいいのでしょうか?
あるいは別の方法がありますでしょうか?

よろしくお願いします。

連続で質問するのも申し訳ないのですが・・・

VS2005 C++ Expressを使ってWindowsフォームアプリケーションを作っています。(C++/CLI)

ボタンなどのフォームのプロパティに、色を指定するものがあると思いますが、例えばBackColorを白に変更したい場合、
this->button1->BackColor = System::Drawing::Color::White;
のように書けると思います。

この、「System::Drawing::Color::White」の部分を変数のようにして記述したいのですが、どのように宣言した型を使用すればよいのでしょうか?
例えば仮...続きを読む

Aベストアンサー

#1です。
すいません。
System::Drawing::Color^ hoge;
ではなく
System::Drawing::Color hoge;
でした。


void func1(int choice){
System::Drawing::Color hoge;
  if(!choice){
    hoge = System::Drawing::Color::White;
  } else {
    hoge = System::Drawing::Color::Red;
  }
  this->button1->BackColor = hoge;
}

Qc++ stringの使い方

お世話になります。
最近c++始めました。
stringの使い方がよくわかりません。
以下のstringの使い方が問題ないか確認頂けますか。
スマホで書くため、文法が合ってないと思いますが、stringの使い方だけ確認させてください。
引数にstringで囲って渡すのは実装として普通行いますか。
やってはいけないですか。
是非ご教示ください。

#define STR1 "mojiretu"
main()
if(check(string(STR1)))



bool check(string str)

Aベストアンサー

間違っちゃいないけど、直に const string でかまわんのでは?

#include <iostream>
#include <string>

const std::string STR1 = "mojiretu";

bool even_length(const std::string& str) {
return str.length() % 2 == 0;
}

int main() {
if ( even_length(STR1) ) {
std::cout << STR1 << " : even\n";
} else {
std::cout << STR1 << " : odd\n";
}
}

QC++/CLI System::String::Fotmat 16進表記

お世話になります

C++/CLIを使用して、16進表記で悩んでいます
Format( "0x{0:x2}, 1 );
期待する値は、"0x01"ですが、"0x1"と表記されてしまいます

Formatを使用した場合は仕方ないのでしょうか?
ほかにマネージを"0x%2x"のように変換する方法を
ご存知の方がいらっしゃいましたら、御教授願います
よろしくおねがいします

Aベストアンサー

リーディング0などの書式指定は無かったと思います

String^ str = String::Format("0x{0,2:X}", 1 ).Replase(" ", "0");
などで代替処理してはいかがでしょう

{0,2:X}は 最初の引数を2桁16進数の文字列に変換されます

String::Format("0x{0,2:X}", 1 )で "0x 1"となるので
この文字列中のスペースを『0』に置換したものを取得します

QVisial C++おけるπの使い方

自宅でCプログラミングの練習をするためVisial C++ 2008を使って
プログラムをしています。y<sin(πx)となった時の
割合などを計算するプログラムで                「M_PIが定義されていない識別子です」
とでてきます。所持している本を参考にしてもM_PI=πとして用いる
と書いてあり、math.hもインクルードしてるので原因が分からなくて
困ってます。Visial c++ではπの使い方には何か別の使い方がある
のでしょうか?よろしくお願いします。
*↓が実際に作ったプログラムです。
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <math.h>

int main(void){
int i,n,count=0;
double x,y,r,error;

srand((unsigned)time(NULL)); /*乱数の初期化*/

printf("How many trials?");
scanf("&d",&n);

for(i=0;i<n;i++){
x=rand()/(RAND_MAX+1.0);
y=rand()/(RAND_MAX+1.0);

if(y<sin(M_PI*x)){
count++;
}
}

r=(double)count/n; /*キャスト演算子を使用*/
error=2/M_PI-r;

printf("Result is %f (Error: %f)\n",r,error);

return 0;
}

自宅でCプログラミングの練習をするためVisial C++ 2008を使って
プログラムをしています。y<sin(πx)となった時の
割合などを計算するプログラムで                「M_PIが定義されていない識別子です」
とでてきます。所持している本を参考にしてもM_PI=πとして用いる
と書いてあり、math.hもインクルードしてるので原因が分からなくて
困ってます。Visial c++ではπの使い方には何か別の使い方がある
のでしょうか?よろしくお願いします。
*↓が実際に作ったプログラムです。
#include ...続きを読む

Aベストアンサー

★アドバイス
・math.hをインクルードする前に『_USE_MATH_DEFINES』定数を define します。

#define _USE_MATH_DEFINES
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <math.h>

int main( void )
{
 :
 return 0;
}
必ず include する前に定義して下さい。

QVC++  System::Stringに変換するには?

現在VisualC++ ExpressEditionを使って、C++の勉強をしながら万年カレンダーを作ろうとしていています。

ひとまずカレンダーの表示に使う月・日・曜日をDateTime::Nowから取り出したいのですが、
DateTime d1 = DateTime::Now.AddMonths;
label1->Text = d1.ToShortTimeString;
と試しにlabelに現在の月を表示させようとしたところ、
「1 番目の引数を 'System::String ^(__clrcall System::DateTime::* )(void)' から 'System::String ^' に変換できません。」
というエラーメッセージとともに弾かれてしまいます。
どこをどう変えればよいのか教えてください。

勉強を始めるのに買ってきた参考書では、DateTime::Now.ToLongTimeString;で日付から時刻まで繋げて表示する方法しか載っていませんでした(索引にもDateTime::Nowのみ)
PCで検索しようとしても別の言語や参考書のHPが大量に引っかかって困っています。

現在VisualC++ ExpressEditionを使って、C++の勉強をしながら万年カレンダーを作ろうとしていています。

ひとまずカレンダーの表示に使う月・日・曜日をDateTime::Nowから取り出したいのですが、
DateTime d1 = DateTime::Now.AddMonths;
label1->Text = d1.ToShortTimeString;
と試しにlabelに現在の月を表示させようとしたところ、
「1 番目の引数を 'System::String ^(__clrcall System::DateTime::* )(void)' から 'System::String ^' に変換できません。」
というエラーメッセージとともに弾かれてし...続きを読む

Aベストアンサー

DateTime d1 = DateTime::Now;
label1->Text = d1.ToString("yyyy年MM月dd日(ddd)dddd");
を試そう(実際にやってみた訳じゃないのでダメかもしんない)

QcygwinでのC++の使い方

cygwinでC言語で書いたプログラムを実行したいのですがcygwinを起動すると
私の名前@なにやらアルファベット
が表示され次の行に

と表示されるんですがこの後にどんなことを書けば
#include<・・・>
としてC++のプログラムを書いていくことができるんですか?そもそもcygwinの使い方が根本的に違うんですかねえ?それともメモ帳かなんかにプログラムを書き保存しそれをcygwinで実行するんですかねえ?とりあえずプログラムを実行できるようにしてください。おねがいします。

Aベストアンサー

> それともメモ帳かなんかにプログラムを書き保存しそれをcygwinで実行するんですかねえ?

おおむねその通りです。

メモ帳でも何でもよいので、エディタでソースファイルを作成してください。作成したソースファイルは、とりあえずホームディレクトリに格納するとよいでしょう(C:\cygwinにCygwinをインストールしたのであれば、C:\cygwin\home\アカウント名がホームディレクトリになります)。

作成したソースファイルがfoo.cppだった場合、

g++ foo.cpp

とすれば、a.exeという実行ファイルが同じディレクトリにできるはずです。そこで、

./a

と入力すれば、a.exeを実行することができます。

QSystem::Stringからconst charへの変換

aという変数がSystem::String型であります。
そこで次に行いたい処理のために、const char*に変換したいのですが、下記のページを参考にプログラムしてみたのですがうまくいきませんでした。
うまくいかなかったというのはまだSystem::String型のままで変換できていなかったとエラーで出てしまいます。
そのような場合は、どのように型変換すればよいのでしょうか?

Aベストアンサー

あ~PtrToStringCharsだけだとconst char*は取れなかったですね。
wcstombs_sと組み合わせないと。
System::Runtime::InteropServices::Marshal::StringToHGlobalAnsiのほうが楽かな。
(つかい終わったらSystem::Runtime::InteropServices::Marshal::FreeHGlobalが必要)


strcmp等のconst char*を引数にとるような関数ではなく、
wcscmp等のconst wchar_t*を引数にとるような関数ならPtrToStringCharsだけでOK。


まぁ、Stringクラスを使っているから、str~の関数をあえて使うような
無駄なことはふつうはしないでしょうけど。


人気Q&Aランキング

おすすめ情報