我是这个话题的新手。 我试图将整数数组转换为字符串。然后串到整数数组,检查我是否得到相同的输入。
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值时,我得到了正确的结果。请帮帮我
答案 0 :(得分: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;
}
答案 1 :(得分: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);
}
我将gint16
更改为int16_t
,因为我不知道应该是什么。您很可能会毫无问题地将其替换为gint16
。