将变量复制到一个缓冲区并读取它

时间:2015-10-07 13:06:00

标签: c buffer store

我创建了三个缓冲区和变量,并将每个变量复制到相应的缓冲区。

然后我从缓冲区中取出指针并打印出来。

cde = form.save(commit=True)

输出:#include <stdlib.h> #include <string.h> int main() { // Buffers. unsigned char a_buffer[sizeof(int)]; unsigned char b_buffer[sizeof(int)]; unsigned char c_buffer[sizeof(float)]; // Variables ressources. int a = 65500; int b = 32000; float c = 3.14; // Variables pointers. int *aa = NULL; int *bb = NULL; float *cc = NULL; /* Copy variables to buffer. */ memcpy(a_buffer, &a, sizeof(int)); memcpy(b_buffer, &b, sizeof(int)); memcpy(c_buffer, &c, sizeof(float)); /* Set pointers. */ aa = (int*) a_buffer; bb = (int*) b_buffer; cc = (float*) c_buffer; // Print values. printf("%i %i %f\n", *aa, *bb, *cc); return 0; }

现在我想将这些变量存储到一个缓冲区中并写下来。

65500 32000 3.140000

输出:#include <stdlib.h> #include <stdint.h> #include <string.h> int main() { // Buffer. unsigned char buffer[sizeof(int) + sizeof(int) + sizeof(float)]; // Buffer pointer (first object). unsigned char *buf_ptr = buffer; // Variables ressources. int a = 65500; int b = 32000; float c = 3.14; // Variables pointers. int *aa = NULL; int *bb = NULL; float *cc = NULL; /* Copy variables to buffer. */ uint16_t cur = 0; memcpy(buf_ptr + cur, &a, sizeof(int)); cur += sizeof(int); memcpy(buf_ptr + cur, &b, sizeof(int)); cur += sizeof(int); memcpy(buf_ptr + cur, &c, sizeof(float)); cur += sizeof(float); /* Set pointers. */ cur = 0; aa = (int*) buf_ptr + cur; cur += sizeof(int); bb = (int*) buf_ptr + cur; cur += sizeof(int); cc = (float*) buf_ptr + cur; cur += sizeof(float); // Print values. printf("%i %i %f\n", *aa, *bb, *cc); return 0; }

第一个变量是正确的,第二个变量总是变化,第三个变量总是零。

这样做的正确方法是什么?

1 个答案:

答案 0 :(得分:2)

简短的回答是,在执行aa = (int *)buf_ptr + cur部分时,由于指针类型的原因,您似乎正在添加错误的偏移量。

改为使用aa = (int *)(buf_ptr + cur)(相应地使用其他指针赋值)。

这是一个做到这一点的想法,看起来很有效:https://ideone.com/64awsM

原因是:当你将buf_ptr转换为(int *)时,你会说这是一个指向整数的指针(这就是你想要的)。 但是,然后向该指针添加偏移cur,因此如果您将buf_ptr视为数组,则访问buf_ptr[cur],其中每个元素都是int。由于您有cur=sizeof(int)(可能是4或8),因此您很快就会离开缓冲区的范围。如果将buf_ptr保留为char数组,则您的偏移量是您预期的单个字节,并且您只在最后执行强制转换。

这也解释了为什么你的第一个元素总是正确的(因为你基本上正在做buf_ptr[0],因为偏移为零,因此元素大小是什么并不重要。)