1

私は2つの32ビットレジスタを読み込んでおり、次を使用して文字列バッファ内に配置しようとしています:

sprintf (buffer, "%s-%s", ((char*)(in32(REGISTER1))) , (char*)(in32(REGISTER2)));

レジスタから読み取った 16 進数値を、char へのポインタとして型キャストせず、上記のようにバッファに出力できますか?

4

3 に答える 3

3

上記のコメントでcraig65535が示唆しているように、問題は次のフレーズで発生する可能性が最も高いです。

レジスタから読み込まれた 16 進値

あなたが 16 進値で読んでいるとは思えません。むしろ、整数で読んでいます。その整数の 16 進表現%X文字列に格納する場合は、次の書式指定子を使用します。

sprintf (buffer, "%08X-%08X", in32(REGISTER1), in32(REGISTER2));

(これ8は「8 文字の幅を使用する」という意味です。これは、「幅が 8 文字0未満になるような値の場合、左にゼロを埋め込む」という意味です。)

有効にキャストできる唯一の方法char *は、レジスタ内の整数値が実際に文字列を格納したメモリ位置へのポインタである場合です。しかし、ここでは明らかにそうではありません。

于 2012-09-14T19:59:04.380 に答える
2

sprintf(buffer, "%08x-%08x", REGISTER1, REGISTER2); -- これは、バッファにレジスタ アドレスが必要であると仮定しています。レジスタの内容を読み取る場合は、それに応じて調整してください。ただし、ポイントは、単純に数値を char* と呼んで数値を取得することはできませんが、sprintf()(およびすべての printf に似た関数) は値の基数を変換できることです。

于 2012-09-14T19:58:15.617 に答える
0

他の回答が示唆するように、を使用して整数を文字列の16進表現に変換できsprintfます%X
しかし、使用するコンパイラや、integer や long の長さについて言及していないため、予期しない結果が生じる可能性があります。
16 ビット コントローラsprintf (buffer, "%08X-%08X", in32(REGISTER1),in32(REGISTER2));では失敗します。

sprintf は long 値を引数として想定し、引数は常に long にキャストされるため、これはほとんどのプラットフォームで機能するはずです。

sprintf (buffer, "%08lX-%08lX", (long)in32(REGISTER1), (long)in32(REGISTER2));
于 2012-09-16T12:21:55.570 に答える