2016-11-14 45 views
2

我是这个主题的新手。 我想将整数数组转换为字符串。然后将字符串转换为整型数组,以检查是否获得相同的输入。将字符串转换为整数数组c

gint16 frame[5] = {10, 2, 3, 7, 5}; 
char *str = malloc(sizeof(char) * (sizeof(frame)+1)); 
char *strp = str; 
size_t j; 
for (j= 0; j < sizeof(frame); j++) { 
    snprintf(strp, 4, "%02x", frame[j]); //hexadecimal 
     strp++; 
} 
// from hexa string to 16 bit integer array 
gint16 n_oframe[5]; 
size_t i_m; 
for (i_m = 0; i_m < 5; i_m++) { 
    char *d = (char*)malloc(sizeof(gint16)); 
    strncpy(d,str,2); 
    n_oframe[i_m] = atol(d); 
    str = str + 2; 
    free(d); 
} 

当我尝试打印出来n_oframe值,我得到的正确的结果。请帮我

+2

'sizeof(char)*(sizeof(frame)+1)'应该给出什么?特别是考虑到“框架”的类型.. –

+0

该数组的* length *(元素的数量)是'sizeof frame/sizeof frame [0]'。 –

+0

'free(str);'会因为你增加了str而崩溃。 – Karthick

回答

1

使用这些功能:

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

typedef int16_t gint16; // define gint16 if not compiling with glib.h 

char *gint16_to_string(gint16 *p, int n) { 
    char *str = malloc(n * 4 + 1); 
    if (str) { 
     for (int i = 0; i < n; i++) { 
      snprintf(str + i * 4, 5, "%04X", p[i] & 0xFFFF); 
     } 
    } 
    return str; 
} 

void string_to_gint16(gint16 *p, int n, const char *str) { 
    if (str) { 
     for (int i = 0; i < n; i++) { 
      unsigned int x = 0; 
      sscanf(str + i * 4, "%4x", &x); 
      p[i] = (gint16)x; 
     } 
    } 
} 

int main(void) { 
    gint16 frame[5] = { 10, 2, 3, 7, 5 }; 

    // encoding in hexadecimal 
    char *str = gint16_to_string(frame, 5); 
    printf("encoded string: %s\n", str); 

    // from hexa string to 16 bit integer array 
    gint16 n_oframe[5]; 
    string_to_gint16(n_oframe, 5, str); 

    printf("n_oframe: "); 
    for (int i = 0; i < 5; i++) { 
     printf("%d, ", n_oframe[i]); 
    } 
    printf("\n"); 

    free(str); 
    return 0; 
} 
+0

如果'gint16'是一个32位'int'系统上的带符号类型,'gint16 frame [5] = {-256};'会打印'FFFF' - 不太可能是有意的。 OTOH,OP的文章缺乏这方面的考虑。建议'snprintf(str + i * 4,5,“%04X”,p [i]&0xFFFFu);' – chux

+1

@chux:很好的一点,我虽然使用'%04hX',但'short'可能大于16位,答案更新。 – chqrlie

1

的评论者发现,大多数的,所以把它放在一起

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

// ALL CHECKS OMMITTED! 

int main() 
{ 
    int16_t frame[5] = { 10, 2, 3, 7, 5 }; 
    // hexadecimal string = 2 characters plus NUL 
    // sizeof(char) == 1, if compiler is standard compliant 
    char *str = malloc(3 * (sizeof(frame)/sizeof(frame[0]) +1)); 
    char *strp = str; 
    size_t j; 
    for (j = 0; j < sizeof(frame)/sizeof(frame[0]); j++) { 
    // again: hexadecimal string = 2 characters plus NUL 
    snprintf(strp, 3, "%02x", frame[j]);  //hexadecimal 
    strp += 2; 
    } 
    // we need a pointer to the start of the string to free it later 
    strp = str; 
    // let's see if we gott all of them 
    printf("str = %s\n",str); 
    // from hexa string to 16 bit integer array 
    int16_t n_oframe[5]; 
    size_t i_m; 
    // and again: hexadecimal string = 2 characters plus NUL 
    // a simple char d[3]; would have been more than suffcient 
    // for the task, but if stack is precious... 
    char *d = (char *) malloc(3); 
    for (i_m = 0; i_m < 5; i_m++) { 
    // it's always the same, just do it once at the beginning 
    //char *d = (char *) malloc(3); 
    strncpy(d, str, 2); 
    // atol() is for base 10 input only, use strtol() instead 
    n_oframe[i_m] = (int16_t)strtol(d,NULL,16); 
    str = str + 2; 
    //free(d); 
    } 
    for (j = 0; j < 5; j++) { 
    printf("%d ", n_oframe[j]); 
    } 
    putchar('\n'); 

    free(d); 
    free(strp); 
    exit(EXIT_SUCCESS); 
} 

我改变gint16int16_t,因为我不知道那是什么应该是。你很可能用gint16代替它,没有问题。

+0

用'snprintf(strp,3,“%02x”,0xFFu&frame [j])来保证输出有限;'。一个'int16_t'可以有像4096或-1这样的值,它会超出分配的缓冲区。 – chux

+0

@chux'snprintf'自动处理它。 'int16_t frame [5] = {10,4096,-1,7,5}'将产生字符串'0a10ff0705'(10,16,255,7,5)。如果有足够的空间可用,'snprintf'返回它将会打印的字符数。你需要检查,但写在代码的顶部:所有检查ommitted! (包括拼写检查)。 – deamentiaemundi

+0

的确,我读到'sprintf()'。 – chux