------------------------------------
Visual Studio 2008 pro
VC++
------------------------------------

基本的な質問で申し訳ないのですが、memcmp()などでバイナリデータとの比較方法について教えてください。

例えばバイナリファイルを開き、その先頭から10バイト分が特定のバイトコードであるかを調べ用とした場合、fread()で10バイト分読み込んだバッファーをmemcmpで比較すればよろしいのでしょうか?
また、その際に比較対象のバイトコードはどのように指定したらよいのでしょうか?
---------------------------------
例:比較対象のバイトコードが0xFFFFFFFFFFFFFFFFFFFFの場合
fread( szBuffer, 1, 10, fp );
memcmp( szBuffer, ???, 10 );
---------------------------------

A 回答 (1件)

もちろん「先頭から 10バイト読み込み memcmp で比較」すれば OK です.


比較対象は「10バイト (以上) の大きさを持つオブジェクト」になります. (unsigned) char の配列とするのが普通かな.
例えば
unsigned char bytecode[] = { 0xff, 0xff, ..., 0xff }; に対して
memcmp(szBuffer, bytecode, 10);
みたいな感じですね.
    • good
    • 0
この回答へのお礼

>>Tacosan様
御回答ありがとうございました。
無事希望する処理を実装することができました。

お礼日時:2009/05/22 13:10

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

このQ&Aを見た人はこんなQ&Aも見ています

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

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

Q主語が複数でも比較級than any other 単数名詞?

問題集に

There are more violins than any other instrument in an orchestra.

という英文がありました。

主語がviolinsなので、instrumentも複数にしても良いのでしょうか?

Mt.Fuji is higher than any other mountain in Japan.のような例文では富士が単数だから1対1で比較する必要があり、ゆえにmountainは単数だという説明を目にしたことがあります。

今回の英文の、主語は複数形で比較対象は単数形を理屈でどう説明できるのでしょうか?

Aベストアンサー

>Eagles soar higher than any other birds. 

これは、birdsと言う表現で、eagles以外の鳥全てを含んだ意味になっているからです。eaglesと、その他の鳥を全部いっしょくたにして比較しています。

>There are more violins than 【any other instruments】 in an orchestra.

と言うのは、やはりおかしくて、any other instrumentが正しいのです。
なぜなら、バイオリンとその他の楽器全ての合計数を比較しているわけではないからです。比べているのは、バイオリンと例えばトランペット、例えばトロンボーンと言うように比べているわけですから、あくまで一つ一つの楽器の種類です。
もし、There are more violins than 【any other instruments】 in an orchestra.と言ってしまえば、トランペット4、トロンボーン5、シンバル3、小太鼓2のようにバイオリン以外の楽器の数を合計し、その総合計よりもバイオリンの数が多いと言うことになります。

>Eagles soar higher than any other birds. 

これは、birdsと言う表現で、eagles以外の鳥全てを含んだ意味になっているからです。eaglesと、その他の鳥を全部いっしょくたにして比較しています。

>There are more violins than 【any other instruments】 in an orchestra.

と言うのは、やはりおかしくて、any other instrumentが正しいのです。
なぜなら、バイオリンとその他の楽器全ての合計数を比較しているわけではないからです。比べているのは、バイオリンと例えばトランペット、例えばトロン...続きを読む

Qmemcpy,memcmp,strcmp,strlen,strcat,

memcpy,memcmp,strcmp,strlen,strcat,strcpy,strstr,strchr
以上の関数を自作しました。
ひとつひとつを見たときに動作を確認したところうまく出来たのですが、この関数をプログラムに組み込んだところうまく動作しませんでした。
どこか間違っているところがあったら指摘して頂きたいと思います<m(__)m>
ちなみに標準関数と全く同じものにしたいわけではなく、それを自分なりに考えて作りたいという趣旨ですので、ご理解ください。


char *MyMemcpy(char *str1, char *str2, size_t n)
{

char *p1 = str1;
char *p2 = str2;


while(n--){
*p1 = *p2;
p1++;
p2++;
}

return str1;
}
void *MyMemcmp(void *str1, void *str2)
{
char *p1 = (char*)str1;
char *p2 = (char*)str2;
int n = 0, k = 0;

while( *p1 != '\0'){
*p1++;
n++;
}

while( *p2 != '\0'){
*p2++;
k++;
}

if(n > k){
return str1;
}else if(n == k){
return 0;
}else if(n < k){
return str2;
}

}
char *MyStrcmp(char *str1, char *str2)
{
char *p1 = str1;
char *p2 = str2;
int n = 0, k = 0;

while( *p1 != '\0'){
*p1++;
n++;
}

while( *p2 != '\0'){
*p2++;
k++;
}

if(n > k){
return str1;
}else if(n == k){
return 0;
}else if(n < k){
return str2;
}

}
size_t MyStrlen(const char *str1)
{
char *p1 = (char*)str1;
size_t len = 0;

while(*p1 != NULL){
*p1++;
len++;
}

return len;
}
char *MyStrcat(char *str1, const char *str2)
{
char *p1 = str1;
char *p2 = (char*)str2;

while(*p1 != NULL){
*p1++;
}
while(*p2 != NULL){
*p1 = *p2;
*p1++;
*p2++;
}

return str1;
}
char *MyStrcpy(char *str1, char *str2)
{
char *p1 = str1;
char *p2 = str2;

while( *p2 != NULL){
*p1 = *p2;
*p1++;
*p2++;
}
*p1 = '\0';

return str1;
}
char *MyStrstr(char *str1, char *str2)
{
char *p1 = str1;
char *p2 = str2;

while(*p1 != *p2)
{
if(*p1 == '\0'){
return 0;
}
*p1++;
}
return p1;

}
char *MyStrchr(const char *str1, char str2)
{
char *p1 = (char*)str1;

while(*p1 != str2)
{
if(*p1 == '\0'){
return 0;
}
*p1++;
}
return p1;
}

memcpy,memcmp,strcmp,strlen,strcat,strcpy,strstr,strchr
以上の関数を自作しました。
ひとつひとつを見たときに動作を確認したところうまく出来たのですが、この関数をプログラムに組み込んだところうまく動作しませんでした。
どこか間違っているところがあったら指摘して頂きたいと思います<m(__)m>
ちなみに標準関数と全く同じものにしたいわけではなく、それを自分なりに考えて作りたいという趣旨ですので、ご理解ください。


char *MyMemcpy(char *str1, char *str2, size_t n)
{

char *p1 = str1;
char...続きを読む

Aベストアンサー

> この関数をプログラムに組み込んだところうまく動作しませんでした。

どんな風に「うまく動作し」なかったのでしょうか?
それがわからなければ、明らかな間違いでも無いかぎり、答えようがありません。

特に
> ちなみに標準関数と全く同じものにしたいわけではなく、それを自分なりに考えて作りたいという趣旨ですので、ご理解ください。
とあるので、このプログラムと標準関数との違いが、間違いなのか仕様通りなのか判断できません。

例えば、
> char *MyStrcmp(char *str1, char *str2)
プログラムを解読すると

str1とstr2、それぞれの文字列の長さを比較。
→長さ等しい場合は (char *)NULL, 異なる場合は、長い方の文字列へのポインタを返す

と、strcmpとはまったく別の関数になっています。(strcmpは文字列の内容も比較し、結果を 負の整数,0,正の整数 (いずれもint型)で返します)


あと、明確な間違いというわけではないですが。
> while(*p1 != NULL){

大抵の処理系では NULL == '\0' == 0 として使えるけど、ヌルポインタとヌル文字はわけて考えた方がいいです。

> この関数をプログラムに組み込んだところうまく動作しませんでした。

どんな風に「うまく動作し」なかったのでしょうか?
それがわからなければ、明らかな間違いでも無いかぎり、答えようがありません。

特に
> ちなみに標準関数と全く同じものにしたいわけではなく、それを自分なりに考えて作りたいという趣旨ですので、ご理解ください。
とあるので、このプログラムと標準関数との違いが、間違いなのか仕様通りなのか判断できません。

例えば、
> char *MyStrcmp(char *str1, char *str2)
プログラムを解読...続きを読む

Q比較級、最上級 A diamond is more precious than any other

比較級、最上級
A diamond is more precious than any other jewel.

A diamond is the で始まるように書き換えるとどうなりますか?

Aベストアンサー

学校文法の正解としては

A diamond is the most precious jewel of all. か
A diamond is the most precious of all the jewels. か。

Mt. Fuji is higher than any other mountain in Japan.
Mt. Fuji is the highest mountain in Japan.
のように最上級では名詞をつけて書き換えることが多いです。

Qこの”void(*m_pViewMode)(BYTE,BYTE,WORD);”このソースコードの意味は?

今、みているソースコードで次のようなコードがありました。


void(*m_pViewMode)(BYTE,BYTE,WORD);

--------(中略)----------------------------

m_pViewMode(err == 0 ? stKey.key : 0x00,clear,stKey.time);


全く何をどうやっているのかよくわからないのですが、これはC言語ではどのようなことをやっているソースコードなのでしょうか?

ご存じの方いらっしゃいましたらご教授お願いいたします。

Aベストアンサー

> void (*m_pViewMode)(BYTE,BYTE,WORD);
これは「関数へのポインタ」型の変数を宣言している。
m_pViewModeはBYTEとBYTEとWORDを引数に取り、返り値のない関数を保持するポインタ変数になる。

> m_pViewMode(err == 0 ? stKey.key : 0x00,clear,stKey.time);
ここでは、m_pViewModeに代入された関数を実行している。
「err == 0 ? stKey.key : 0x00」の部分が最初の引数で、三項演算子?:を用いてerrが0のときはstKey.keyを、それ以外では0x00を最初の引数にする。

Q比較級 than SV について

こんにちは。比較級を勉強しているのですが、以下の文で
thanの後がSVになる場合とそうでない場合の違いがわかりません。
どういう時に than SV になるのか教えていただけると助かります。

〈thanの後がSVにならない場合〉
She walks more slowly than other girls.
He can speak English better than me.
Tom got to the station earlier than his friends.

〈thanの後がSVになる場合〉
He read the book more carefully than I did.
My brother studies much longer than I do.
Do you study harder than he does?

よろしくお願いします!

Aベストアンサー

こちらでいろいろな考えが出てきています。

http://oshiete.goo.ne.jp/qa/1654320.html

単純にいうと,接続詞か前置詞か。
さらに接続詞なら省略も含まれる。
さらには,接続詞と言っても従属接続詞的な場合もあれば等位接続詞
的な場合もあり,関係代名詞的なものもある。

than the record のように接続詞的には説明できず,
句構造(前置詞)としか考えられないものが出てくる。

He is taller than me.
は長い間,日本では誤りだとされてきました。
he is tall と I am tall と比べるんだから I という主格。

現実には He is taller than I. という英語は避けられ,
He is taller than I am.
とするか,
He is taller than me. とする。

than me というのはネイティブにとっては極めて普通の英語です。

He likes her better than he likes me. の省略が
He likes her better than me. だという意見もよく見ますが,
He likes her better than I like her. も
He likes her better than me. と言えます。

まさしく,日本語の「彼は私より彼女の方が好きだ」という日本語で
「私より」が「彼は」との比較か,「彼女を」との比較か
あいまいになるのと同じ。
than me というのはそういう表現です。

上であげた質問の回答にもありますが,than ~は先に表現ありき,
文法の説明は後付け。

こちらでいろいろな考えが出てきています。

http://oshiete.goo.ne.jp/qa/1654320.html

単純にいうと,接続詞か前置詞か。
さらに接続詞なら省略も含まれる。
さらには,接続詞と言っても従属接続詞的な場合もあれば等位接続詞
的な場合もあり,関係代名詞的なものもある。

than the record のように接続詞的には説明できず,
句構造(前置詞)としか考えられないものが出てくる。

He is taller than me.
は長い間,日本では誤りだとされてきました。
he is tall と I am tall と比べるんだから I という主格...続きを読む

Qint i,j; \n i=0,j=5;

int i,j;
i=0;
j=5:
と書いてあるソースは普通ですが、
int i,j;
i=0,j=5:
と書いてあるソースもあります。
後者はC++の正しい書式ですか?

カンマ演算子というのは後者のカンマのことですか?

Aベストアンサー

 正しい書式です。

i=0,j=5;
 における、「,」をカンマ演算子といいます。2項の演算子です。カンマで区切られた演算を「左から順番に」実行し、最後の演算を結果として返します。
 したがって、例の文であれば、i=0を実行し、次にj=5を実行。そして、j=5の結果の5を結果として返します。
 ・・・
 が、本来的には、あまり、例のような使い方はしませんね。よく見られるのは、次のような場合です。

 for (i=0,j=0 ; i < 50 ; ++i,++j) {

 のような形でよく見られます。for文の各式は、一つの式でなければならないので、こんな書き方をするわけです。初期化と更新部が一つにまとまり、ループが読みやすくなるのが利点かな。

Qmore than ? better than ?

いつもお世話になっております。
中学生に聞かれているんですが、
I like baseball better than any other sport.
という文はOK でしょうか?わたしは、better than の部分をmore than にすべきではないかと思うのですが、説明ができません・・・。
more than は可能だと思うのですが、better than でもOKですか?
宜しくご指導ください。

Aベストアンサー

手元に「詳説 レクシス プラネットボード 103人のネイティブスピーカーに聞く生きた英文法・語法」という本があります。その中にお尋ねと同じ質問をして得られた解答と分析があります。それによると、「使用率はあまり変わら」ず、betterはmoreに比べて「やや口語である人もいる」とあり、「学習者はいずれを用いてもよいだろう」としています。ちなみに、英米の差はほとんどないという結果が表から読み取れます。

Qc言語プログラミングでアルファベットの一覧を5,10,15,20,25文字目については大文字、それ以

c言語プログラミングでアルファベットの一覧を5,10,15,20,25文字目については大文字、それ以外は小文字で表示するプログラムを作成できる方お願いします
char x;
for(x=0;x<26;x++)
[
if(x%2==0) printf(”%c”___);
else printf(”%c”,___);
]

ここまで作ったんですけど、下線部がわかりません
あと、違っている箇所があれば教えいただける方お願いします

Aベストアンサー

No.2修正
前:    if ((pt - ss + 1) % 5 == 0) {
後:    if (!((pt - ss + 1) % 5)) {

Qthan any other か than any others か?

問題集の中に、
I like this song better than any others.
This book was more useful than any other.
という2つの文がのっていました。どっちが正しいのでしょうか?
I like this song better than any other song.
ならわかるのですが。

Aベストアンサー

回答者No.1です.お礼を拝見しました.

はい,両方とも使われる…ということですから,両方とも正しいと言ってよいでしょう.

QAF_UNIXのsocketと共有メモリを使ったリングバッファーの速度比較

いま、仕事でlinux上で2つのプロセスを動かし、プロセスの間で、高速で大量のデータの受け渡しが必要なプログラムを作っています。プロセス間の通信は普通の socket で AF_UNIX を使っています。
 できるだけ速度を上げたいのですが、AF_UNIXのsocketのかわりに共有メモリを使ってリングバッファーでキューを作ってデータを送るという案が出ました。この方法によって速度の向上は期待できるでしょうか?

Aベストアンサー

プロセスAからプロセスBへソケットを使用してデータを送信する場合、以下のようにメモリへのread/writeが発生すると思います。

1)プロセスA上のバッファへ送信データを書き込む
2)プロセスA上のバッファよりカーネル上のバッファへコピー
3)カーネル上のバッファよりプロセスB上のバッファへコピー
4)プロセスB上のバッファの受信データを読み込む

共用メモリを使用した場合は、2)および3)のread/write部分を省略できます。
2)および3)の部分は実際にはsend()/recv()を使用して行いますが、send()/recv()はデータのコピーだけではなく送信の制御のための作業を行います(当たり前ですが)。
send()/recv()の制御機構の処理時間と自前の排他制御の処理時間が同程度であれば、大量データのコピー処理を削減できるので速度の向上を期待できるのではないでしょうか。


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング

おすすめ情報