レジストリのバイナリデータの設定 – プログラミング – Home

レジストリのバイナリデータの設定
 
通知
すべてクリア

[解決済] レジストリのバイナリデータの設定


さと~
 さと~
(@さと~)
ゲスト
結合: 11年前
投稿: 4
Topic starter  

iniファイルの指定されたセクション内にあるキーから取得した値を編集して、レジスト
リキーに設定するソースを作成しており、編集した値を設定する文字列が合わず、ソース
が止まっております。

iniファイル
[xxxx]
abc=0x3f,0x8a,0x2e,0x64,0x01

ソース
CHAR temp[128];
CHAR abcdata[128];
BYTE vData[128];

//iniファイルから値取得
r = GetPrivateProfileString(sect, abc, ", temp, sizeof(temp), path);
if (r > 0) strcpy(abcdata, temp);

//バイナリデータ化にする
※ここで「vData[] = {0x3f,0x8a,0x2e,0x64,0x01};」のような形にするにはどのような
処理がありますのでしょうか?

//レジストリキーの値設定
r = RegSetValueEx(key, name, 0, REG_BINARY, (LPBYTE)vData,
sizeof(vData)/sizeof(vData[0]));

環境
XP, VC6.0

以上、ご教授よろしくお願い申し上げます。


引用未解決
トピックタグ
瀬戸っぷ
 瀬戸っぷ
(@瀬戸っぷ)
ゲスト
結合: 18年前
投稿: 178
 

文字列0x3f,0x8a,0x2e,0x64,0x01から、数値変換してBYTE配列にしたい。
ってコトですよね?

strtol()系を使用されては?
# ただし戻り値はlong型なので、その辺りにはご注意を。

http://msdn.microsoft.com/ja-jp/library/w4z2wdyc.aspx
こっちはVS2013のもの…ですけどね。
手元のVC6のリファレンスマニュアルでstrtol()について調べてみてくださいな。
# まぁ、検索すればそういう処理コードの例くらい見つかるでしょう。たぶん。


返信引用
さと~
 さと~
(@さと~)
ゲスト
結合: 11年前
投稿: 4
Topic starter  

瀬戸っぷさん、ありがとうございます。

TCHAR *endp;
LONG value;
value = strtol(abcdata, &endp, 0);

に行い、結果が「63」になりましたが、繰返しが必要でしょうか?

初歩的ですみませんが、宜しくお願い申し上げます。


返信引用
仲澤@失業者
(@uncle_kei)
Prominent Member
結合: 5年前
投稿: 828
 

>に行い、結果が「63」になりましたが、繰返しが必要でしょうか?

それだと、頭の0x3fの部分しか変換できていません。
やや難しいですが、strtok()関数などを使用して、区切り文字(カンマ)で
分離しながらstrtol()で数値変換してはどうでしょう。

ちなみにstrtol()の「基数」はこの場合は16進数なので16を指定します。


返信引用
さと~
 さと~
(@さと~)
ゲスト
結合: 11年前
投稿: 4
Topic starter  

仲澤さん、ありがとうございます。

While文で、strtolを処理して、繰返し終了後、memcpyで配列をコピー
しましたが、うまくいきませんでした。

サンプルソースを頂ければ、幸いです。

お手数ですが、宜しくお願い申し上げます。


返信引用
蒼の洞窟
 蒼の洞窟
(@蒼の洞窟)
ゲスト
結合: 12年前
投稿: 28
 

strtolの2番目の引数を使えば、strtok使わなくてもいけるかな?

以下、てけとー

#include <cstdio>
#include <windows.h>
#include <tchar.h>

int main(void)
{
TCHAR abcdata[128] = _T(0x3f,0x8a,0x2e,0x64,0x01);
BYTE vData[128] = {0};

TCHAR* pStart = abcdata;
TCHAR* pEnd = NULL;

int i = 0;
while (true)
{
long l = _tcstol(pStart, &pEnd, 16);

vData[i] = (BYTE)l;

if (*pEnd == _T('\0')) {
break;
}

pStart = pEnd + 1; // 手抜き CharNextとか使ったほうがよさげ
++i;
}

for (int j = 0; j <= i; ++j) {
printf(0x%02x , vData[j]);
}
printf(\n);

return 0;
}


返信引用
仲澤@失業者
(@uncle_kei)
Prominent Member
結合: 5年前
投稿: 828
 

まぁこんな感じ、

char abcdata[ 32] = {0x3f,0x8a,0x2e,0x64,0x01};
char * pEnd;
char * context;
long Value[ 10];
long ValueCnt = 0;
char * strwork = strtok_s( abcdata, ,, &context);//abcdataは破壊される
while( NULL != strwork){
Value[ ValueCnt] = strtol( strwork, &pEnd, 16);
ValueCnt++;
strwork = strtok_s( NULL, ,, &context);//NULLを与えると次のトークンを戻す
}


返信引用
さと~
 さと~
(@さと~)
ゲスト
結合: 11年前
投稿: 4
Topic starter  

蒼の洞窟さん、仲澤さん

サンプルソースを提供いただき、ありがとうございました。
助かりました。

以上、取り次ぎ、お礼とさせていただきます。


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました