【问题标题】:how to put an unsigned int into a char array and extract it back如何将 unsigned int 放入 char 数组并将其提取回来
【发布时间】:2012-04-28 20:59:01
【问题描述】:

有人可以解释为什么这不起作用吗?我正在尝试将一个 unsigned int 放入 char 缓冲区,然后将其取回另一个 unsigned int。

  1 #include<stdio.h>
  2 #include<string.h>
  3 int main(){
  4   unsigned int tester = 320;
  5   char buffer[512];
  6   memset(buffer,0,512);
  7   memcpy(buffer,&tester,sizeof(unsigned int));
  8   /*buffer[0]|=tester;
  9   buffer[1]|=(tester>>8);
 10   buffer[2]|=(tester>>16);
 11   buffer[3]|=(tester>>24);*/
 12   unsigned int tested;
 13   memcpy(&tested,buffer,sizeof(unsigned int));
 14 
 15   /*tested|=(buffer[3]<<24);
 16   tested|=(buffer[2]<<16);
 17   tested|=(buffer[1]<<8);
 18   tested|=(buffer[0]);*/
 19   printf("\n %d\n",tested);
 20 }

当我执行 memcpy 时,它可以工作。但是当我采用按位方法时,它不起作用。有趣的是,当我将缓冲区大小设置为 20 时,它可以工作。但是当我使用大缓冲区,甚至 50 个缓冲区时,它总是以按位方式打印 368。 memcpy 再次正常工作。

【问题讨论】:

    标签: c++ c bit-manipulation memcpy


    【解决方案1】:

    当您在第 12 行 unsigned int tested; 声明 test 时,它应该初始化为零 unsigned int tested =0; 此外,使用 -Wuninitialized 或 -Wall 进行编译会警告您测试的未初始化。

    【讨论】:

    • gcc 会在您提供 -Wuninitialized(包含在 -Wall 中)时发出警告
    • 我警告 OP 没有任何选择。 ;-)
    • 是的,你是对的!谢谢!!是因为测试被垃圾初始化而我所做的只是覆盖它吗?
    • 是的。然而,一个警告。您可能希望使数组成为 unsigned char 数组,或者如果您的编译器将普通 char 视为有符号,您将被一个符号位所困扰。 (双关语)
    • 我知道。但在我的主应用程序中,我并没有真正控制缓冲区,它将被传递给我。感谢您的警告:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多