0

重複の可能性:
C の 16 進数から char 配列へ

たとえば、このような 16 進数が必要な場合は、次のよう"F32FC0F5EC894E16"に unsigned char 変数に格納します。

unsigned char s[8] = {0xF3, 0x2F, 0xC0, 0xF5, 0xEC, 0x89, 0x4E, 0x16};

しかし、この番号を持つ文字列でこれを取得している場合:

char a[16]="F32FC0F5EC894E16"

これを 16 進数に変換して、上記の変数 's' と同様の方法で使用するにはどうすればよいですか?

4

2 に答える 2

2

この割り当てにはオーバーフローがあります。

char a[16]="F32FC0F5EC894E16"

null ターミネータの余地がありませんでした。char 配列は null で終了する必要はありませんが、文字列は終了します。これは文字列宣言です。ハードコードされた値で初期化された変数の char 配列サイズを宣言しないでください[]

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

void hexString2byteStream (char *in, unsigned char *out, int len) {
    char *p = in;
    char byte[3] = { 0 };
    int i = 0;

    while (sscanf(p, "%2s", byte)) {
        out[i++] = strtoul(byte, NULL, 16);
        if (i == len) break;
        p += 2;
    }
}

int main(void) {
    char a[]="F32FC0F5EC894E16";
    unsigned char bs[8];
    int i;

    hexString2byteStream(a, bs, sizeof(bs));

    for (i = 0; i < 8; i++) {
        printf("%x\n", bs[i]);
    }

    return 0;
}

outnull で終了する文字列ではないことに注意してください。

于 2012-05-16T07:22:23.957 に答える
0

16 進数の桁数が常に偶数で、文字列が大文字の場合、アルゴリズムは簡単です。注意、例外やエラーに対する制御はありません。これは基本的なアルゴリズムにすぎません。

void hexCharsToBinary ( char* a, int length, char* s)
{
    int i;
    for( i=0; i< length; i++)
    {
        char mask    = (i&1)? 0xf0 : 0x0f ;
        char charVal = ((*(a+i)>='0'&&*(a+i)<='9')?*(a+i)-'0':*(a+i)-'A'+10) ;

        s[i>>1] = (s[i>>1]&mask) | charVal << ((i&1)?0:4) ;
    }

 }
于 2012-05-16T07:12:18.230 に答える