- 締切済み
Visual Studio 2005で何ビットか確認したいのですが、、、
初めまして、こんにちは。 最近C言語を勉強し始め、Visual Studio 2005を使用しています。 そこで質問なのですが、取得したデータが何ビットであるか確認したいのですが、どのように検索して見分けたらよろしいですか?? 8ビットであるか16ビットであるかを確認したいのですが、わからないので知っている方がいればよろしくお願いします。
- みんなの回答 (6)
- 専門家の回答
みんなの回答
- noocyte
- ベストアンサー率58% (171/291)
#4 です.再び訂正.orz MultiByteToWideChar() じゃなくて WideCharToMultiByte() です. 次の2箇所を訂正. // まず,UTF-8 文字列バッファの必要バイト数を調べる. result = WideCharToMultiByte(CP_UTF8, 0, Value, -1, NULL, 0, NULL, NULL); // UTF-16 → UTF-8 変換を行う. result = WideCharToMultiByte(CP_UTF8, 0, Value, -1, utf8String, utf8Size, NULL, NULL);
- noocyte
- ベストアンサー率58% (171/291)
#4 です.すみません.↓この1行を見落としていました. > 最終的にはUTF_8で表示させたい #4 の「それから,」以後の部分を次のように訂正します. > printf("%s\n",Value); Unicode にしたいのならば,Value は char* ではなく wchar_t* なので UTF-16 → UTF-8 変換して出力しなきゃ. char *utf8String; // UTF-8 文字列バッファへのポインタ size_t utf8Size; // UTF-8 文字列のバイト数 (終端 NUL 含む) int result; // MultiByteToWideChar() の戻り値 // まず,UTF-8 文字列バッファの必要バイト数を調べる. result = MultiByteToWideChar(CP_UTF8, 0, Value, -1, NULL, 0); if(result <= 0) { fprintf(stderr, "UTF-8 文字列サイズ取得エラー (%lu)\n", GetLastError()); return; } utf8Size = (size_t)result; // UTF-8 文字列用バッファを確保する. if((utf8String = malloc(utf8Size)) == NULL) { fprintf(stderr, "メモリ不足\n"); return; } // UTF-16 → UTF-8 変換を行う. result = MultiByteToWideChar(CP_UTF8, 0, Value, -1, utf8String, utf8Size); if(result <= 0) { fprintf(stderr, "UTF-16 → UTF-8 変換エラー (%lu)\n", GetLastError()); return; } // UTF-8 文字列を出力する. printf("%s\n", utf8String); // UTF-8 文字列バッファを解放する. free(utf8String);
- noocyte
- ベストアンサー率58% (171/291)
> 取得したデータが何ビットであるか確認したい > 8ビットであるか16ビットであるかを確認したい > if(ValueType == REG_SZ) printf("%s\n",Value); Windows プログラミングでは,「Unicode 文字列」と「ワイド文字列」はどちらも UTF-16 の意味であり,UTF-8 ではありません.UTF-8 はマルチバイト文字列として扱われ, 明示的にコードページ CP_UTF8=65001 を指定しない限り WinAPI では使えないはず. > RegQueryValueEx(hkey, L"****", NULL, &ValueType, Value, &ValueSize); > これがUTF_16なのかUTF_8で取得しているのかがわからない 「プロジェクトの文字セット」を「Unicode 文字セット」に設定していれば wchar_t* (UTF-16),「マルチバイト (ANSI) 文字セット」ならば char* (シフトJIS). RegEnumValue http://msdn.microsoft.com/library/ja/default.asp?url=/library/ja/jpsysinf/html/_win32_regenumvalue.asp → パラメータ → lpType → 値 → REG_SZ それから, > printf("%s\n",Value); Unicode にしたいのならば,Value は char* ではなく wchar_t* なので UTF-16 → シフトJIS 変換して出力しなきゃ. 一番簡単なのは (Windows 版独自のやり方ですが), // デフォルトのロケール (マルチバイト文字のコード=シフトJIS) を設定する. // (本当は printf の直前ではなくアプリケーションの最初に設定すべき.) setlocale(LC_ALL, ""); // UTF-16 → シフトJIS 変換して出力する. printf("%S\n", Value); // %S の 'S' は大文字 (ただし1文字でも変換できない文字があると出力されないのが難点. だめな場合は WideCharToMultiByte() を使用して変換すること.)
これでいくかとは思います。 void QueryValue(void){ HKEY hkey; DWORD ValueType; DWORD ValueSize; wchar_t Value[1000]; int BIT,i; for (i=0;i<1000;i++) Value[i]=0xFFFF; /*レジストリキーのオープン*/ RegOpenKeyEx( HKEY_LOCAL_MACHINE, L"***\\******\\**", 0, KEY_ALL_ACCESS, &hkey); ValueSize = 1000; /*レジストリ値の取得*/ RegQueryValueEx( hkey, L"****", NULL, &ValueType, Value, &ValueSize); for (BIT=8,i=0;i+1<1000;i++) if (!(Value[i] & 0xFF) && !((Value[i] >>8) & 0xFF)) BIT=16; /*結果の表示*/ if(ValueType == REG_SZ) { switch (BIT) { case 8: printf((char*)Value); break; case 16: wprintf(Value); break; } printf("\n"); } else printf("....can't read\n"); /*終了*/ RegCloseKey(hkey); }
お礼
返信遅れてすいません。 PCが見れない環境に追いやられてました。 考えてくださってありがとうございます! すぐに試してみます!! またよろしくお願いします。
データ = a とするなら8ビット単位とするとき、 sizeof(a)<<3; で算出できます。 取得データの値の場合、整数や文字コード値であれば for (i=0,bit=0;i<=sizeof(a)<<3;i++,a>>=1) { bit+=a&1; } printf("%d bit\n",bit); のようにして算出します。
お礼
返信ありがとうございます。 おそらくできるのですが、C初心者のためエラーが出てしまい解決できませんです。。。 >>=' : 不正な左オペランドです。 '&' : 不正な左オペランドです。 と2つエラーが出てしまい解決できませんでした。。。 koko uさんの回答ほうに今やってるソースを載せてみましたので時間があったら見てください
- koko_u_
- ベストアンサー率18% (459/2509)
>取得したデータが何ビットであるか確認したい どこから、どのように「取得した」のかを補足にどうぞ。
お礼
返信ありがとうございます。 すいません、質問が不十分でした。 今やっているのは、レジストリからデータを取得しそのデータを表示すると言うようなことをしています。 ただデータはユニコード化(?)をして取得したいので、下記のようなソースになっています。 ただこれがUTF_16なのかUTF_8で取得しているのかがわからないので確認したのです。。。 最終的にはUTF_8で表示させたいのですが、下記ソースがどちらなのかわからず質問しました。 よろしくお願いします。 void QueryValue(void){ HKEY hkey; DWORD ValueType; DWORD ValueSize; wchar_t Value[1000]; /*レジストリキーのオープン*/ RegOpenKeyEx( HKEY_LOCAL_MACHINE, L"***\\******\\**", 0, KEY_ALL_ACCESS, &hkey); ValueSize = 1000; /*レジストリ値の取得*/ RegQueryValueEx( hkey, L"****", NULL, &ValueType, Value, &ValueSize); /*結果の表示*/ if(ValueType == REG_SZ) printf("%s\n",Value); else printf("....can't read\n"); /*終了*/ RegCloseKey(hkey); }
お礼
すいません。 PCが見れない環境にいて返信遅れました。 いろいろありがとうございます!! すぐにやってみたいと思います!! また変な質問をしてしまうかと思いますがよろしくお願いします。