web-dev-qa-db-ja.com

Cで16進数を文字列に変換しますか?

こんにちは私はdigidynamiccを使用しています。これを文字列に変換しようとしています

char readingreg[4];
readingreg[0] = 4a;
readingreg[1] = aa;
readingreg[2] = aa;
readingreg[3] = a0;

現在、printfステートメントを実行するときは、次のようにする必要があります。

printf("This is element 0: %x\n", readingreg[0]);

しかし、私はこれを文字列にしたいので、このようなprintfステートメントを使用できます

  printf("This is element 0: %s\n", readingreg[0]);

基本的に、readingreg配列をTCP/IPポート経由で送信しているので、文字列として送信する必要があります。文字列に変換できないようです。ご協力いただきありがとうございます。また、配列全体ではなく、一度に各要素を実行する方法を誰かに教えてもらえれば、要素は4つしかないので、それで問題ありません。

6
Dale Reed

プレーンなcharが署名されると0xaaがオーバーフローします。unsigned charを使用してください:

#include <stdio.h>

int main(void)
{
    unsigned char readingreg[4];
    readingreg[0] = 0x4a;
    readingreg[1] = 0xaa;
    readingreg[2] = 0xaa;
    readingreg[3] = 0xa0;
    char temp[4];

    sprintf(temp, "%x", readingreg[0]);
    printf("This is element 0: %s\n", temp);
    return 0;
}
8
David Ranieri

マシンがビッグエンディアンの場合、次のことができます。

char str[9];

sprintf(str, "%x", *(uint32_t *)readingreg);

マシンがリトルエンディアンの場合は、バイト順序を入れ替える必要があります。

char str[9];
uint32_t Host;

Host = htonl(*(uint32_t *)readingreg);
sprintf(str, "%x", Host);

移植性が懸念される場合は、エンディアンに関係なく、方法2を使用する必要があります。

次の出力が得られます。

printf("0x%s\n", str);

0x4aaaaaa0

2
Fiddling Bits