• 締切済み

Visual Studio 2005で何ビットか確認したいのですが、、、

初めまして、こんにちは。 最近C言語を勉強し始め、Visual Studio 2005を使用しています。 そこで質問なのですが、取得したデータが何ビットであるか確認したいのですが、どのように検索して見分けたらよろしいですか?? 8ビットであるか16ビットであるかを確認したいのですが、わからないので知っている方がいればよろしくお願いします。

みんなの回答

  • noocyte
  • ベストアンサー率58% (171/291)
回答No.6

#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);

noname#153284
質問者

お礼

すいません。 PCが見れない環境にいて返信遅れました。 いろいろありがとうございます!! すぐにやってみたいと思います!! また変な質問をしてしまうかと思いますがよろしくお願いします。

  • noocyte
  • ベストアンサー率58% (171/291)
回答No.5

#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)
回答No.4

> 取得したデータが何ビットであるか確認したい > 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() を使用して変換すること.)

noname#50176
noname#50176
回答No.3

これでいくかとは思います。 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); }

noname#153284
質問者

お礼

返信遅れてすいません。 PCが見れない環境に追いやられてました。 考えてくださってありがとうございます! すぐに試してみます!! またよろしくお願いします。

noname#50176
noname#50176
回答No.2

データ = 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); のようにして算出します。

noname#153284
質問者

お礼

返信ありがとうございます。 おそらくできるのですが、C初心者のためエラーが出てしまい解決できませんです。。。 >>=' : 不正な左オペランドです。 '&' : 不正な左オペランドです。 と2つエラーが出てしまい解決できませんでした。。。 koko uさんの回答ほうに今やってるソースを載せてみましたので時間があったら見てください

  • koko_u_
  • ベストアンサー率18% (459/2509)
回答No.1

>取得したデータが何ビットであるか確認したい どこから、どのように「取得した」のかを補足にどうぞ。

noname#153284
質問者

お礼

返信ありがとうございます。 すいません、質問が不十分でした。 今やっているのは、レジストリからデータを取得しそのデータを表示すると言うようなことをしています。 ただデータはユニコード化(?)をして取得したいので、下記のようなソースになっています。 ただこれが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); }

関連するQ&A