2016-12-12 27 views
-1

unsigned charを16進(unsigned intを使用)に変換したいと考えています。これはこれまでの私のコードです。私はunsigned char配列を生成するprogram1を持っていて、他のprogram2はunsigned intを使っているだけの16進数しか取らないので、無関係なchar配列の入力を得て、その配列を16進数に変換します。

(例えば、プログラム1出力 "1234567812345678"、PROGRAM2べきで出力 "31323334353637383132333435363738")

申し訳ありませんが、この質問は、ダムと思われる場合。ここでの答えを見てみましたが、私の望むものではありませんでした。符号なし文字配列を16進数に変換する

uint64_t phex (unsigned char[16], long); 



int main (void) { 

int i; 
unsigned char key[16] = "1234567812345678"; 


uint64_t* keyHex = phex(key,16); //store into an array here 

for(i = 0; i < 16; i++) 
printf("%.2x ", keyHex[i]); 

free(keyHex); 

return 0; 

} 


uint64_t phex(unsigned char* string, long len) 
{ 

int i; 
//allocate memory for your array 
uint64_t* hex = (uint64_t*)malloc(sizeof(uint64_t) * len); 

for(i = 0; i < len; ++i) { 
    //do char to int conversion on every element of char array 
    hex[i] = string[i] - '0'; 
} 

//return integer array 
return hex; 

} 
+0

[ 'malloc'におけるCの結果をキャストしない]を(http://stackoverflow.com/q/605845/995714)16進数で –

+0

' 0x1234567812345678'は '小数で1311768465173141112'あります。私はあなたが '31323334353637383132333435363738'を取得するか分からない。たぶん、バイナリデータを16進文字列表現に変換したいのですか? –

+0

@BarmakShemirani 1234567812345678(10進数)を16進数に変換する31323334353637383132333435363738です。 – vivola

答えて

0

私は

uint64_t phex (unsigned char[16], long); 

として関数のシグネチャを参照してくださいので、私は(多分私が間違っているとあなたがそれぞれを変換したい、あなたは1つの番号を表す、1つの文字列を変換するためにuint64_tの配列を必要としないと思います1文字をそのchar表現からintに変換し、16進数で表示します)。

まずは、小数に変換するには、次のコードを考えてみましょう(実際には、あなたの例では数 - 1234567812345678は - 進数のように見える):

uint64_t phex(unsigned char* string, long len) 
{ 

    int i; 
    //you do not need to allocate memory for array 
    uint64_t hex = 0; // just one variable 

    for (i = 0; i < len; ++i) { 
     hex *= 10; // shift 
     hex += string[i] - '0'; // add to the smallest rank 
    } 

    //return integer Value 
    return hex; 

} 

次に進のためのプログラムは次のようになります。

#include <stdio.h> 
#include <stdint.h> 
#include <string.h> 
uint64_t phex(unsigned char[16], long); 

int main(void) { 

    int i; 
    unsigned char key[16] = "A123B00CF1"; 


    uint64_t keyHex = phex(key, strlen(key)); 

    printf("%lld(dec) = %llx(hex)", keyHex, keyHex); 

    return 0; 
} 


uint64_t phex(unsigned char* string, long len) 
{ 
    int i; 
    uint64_t hex = 0; 
    for (i = 0; i < len; ++i) { 
     hex *= 0x10; // shift for one hexadecimal digit 
     // -'0' for digits 0..9 and -('A'-10) for digits `A`..`F` 
     hex += toupper(string[i]) - ((string[i] >= 'A') ? ('A' - 10) : '0'); 
     // TODO: Consider making check for characters that are not hexadecimal 
     // e.g. use isxdigit(string[i]) in some if statement 
    } 
    return hex; 
} 

注:例コードには間違いがあります。uint64_t* keyHexは、uint64_t(ポインタは `` uint64_t * `)を返す関数の値をとりますが、yoあなたは私の考えを受け入れます。ポインタはまったく必要ありません。

0

あなたが行う必要があるのは、値を印刷するだけであれば、変換する必要はありません。元の配列にprintf%.2xを使用してください。

あなたには、いくつかの他の機能では、配列を使用したい場合でも、 keyに格納されている実際のバイトがASCII文字である
int main (void) { 
    int i; 
    unsigned char key[16] = "1234567812345678"; 
    for(i = 0; i < 16; i++) 
     printf("%.2x", key[i]); 
    return 0; 
} 

、すなわち0x310x32などあなたは、一般的に、直接配列key

編集を使用することができます。文字配列に出力を格納するには、sprintf関数を使用できます。

char hex[33]; 
for(i = 0; i < 16; i++) 
    sprintf(hex+2*i, "%.2x", key[i]); 

はまた、元の配列keyが終わりに\0を考慮するために、17バイトでなければならないことに注意してください。

+0

はunsigned intとして出力を保存する方法はありますか?私のprogram2はunsigned intを取ります。 – vivola

0

char( '1'、 '2'など)を16進表現(31は '1'、32は '2'など)に変換することは、 uint64_tが必要です。

しかし、次のように自分のタスクコードは(uint64_tなし)ことができますについて:ここでは

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

unsigned int * phex(unsigned char[16], long); 

int main(void) { 
    int i; 
    unsigned char key[16] = "1234567812345678"; 
    unsigned* keyHex = phex(key, strlen(key)); // strlen(key) to determine number of characters 
    for (i = 0; i < 16; i++) 
     printf("%.2x", keyHex[i]); // you do need space as I see from your example 
    free(keyHex); 
    return 0; 

} 


unsigned int * phex(unsigned char* string, long len) 
{ 
    int i; 
    //allocate memory for array 
    unsigned int * hex = (unsigned int *)malloc(sizeof(unsigned int) * len); 
    for (i = 0; i < len; ++i) { 
     //no special conversion needed 
     hex[i] = string[i]; 
    } 
    //return array with hexadecimal representation for each character in string 
    return hex; 
} 
+0

私のプログラム2は、unsigned intのみを取ります。 – vivola

0

は、それが私の感想です - phex()機能が含ま新しく割り当てられた文字列にメモリに任意のデータ を変換し、 16進表現。

main()関数の使用例を示します。出力は、dataの場合、「31323334353637383930」です。

#include <stdlib.h> /* malloc() */ 
#include <stdio.h> /* sprintf() */ 
#include <string.h> /* strlen(), in the example main() */ 

/* 
* Return a hex string representing the data pointed to by `p`, 
* converting `n` bytes. 
* 
* The string should be deallocated using `free()` by the caller. 
*/ 
char *phex(const void *p, size_t n) 
{ 
    const unsigned char *cp = p;    /* Access as bytes. */ 
    char *s = malloc(2*n + 1);  /* 2*n hex digits, plus NUL. */ 
    size_t k; 

    /* 
    * Just in case - if allocation failed. 
    */ 
    if (s == NULL) 
     return s; 

    for (k = 0; k < n; ++k) { 
     /* 
     * Convert one byte of data into two hex-digit characters. 
     */ 
     sprintf(s + 2*k, "%02X", cp[k]); 
    } 

    /* 
    * Terminate the string with a NUL character. 
    */ 
    s[2*n] = '\0'; 

    return s; 
} 

/* 
* Sample use of `phex()`. 
*/ 
int main(void) 
{ 
    const char *data = "1234567890";    /* Sample data */ 
    char *h = phex(data, strlen(data)); /* Convert to hex string */ 

    if (h != NULL) 
     puts(h);         /* Print result */ 

    free(h);        /* Deallocate hex string */ 
    return 0; 
} 
関連する問題