【问题标题】:How do I convert and break a 2 byte integer into 2 different chars in C?如何在 C 中将 2 字节整数转换并分解为 2 个不同的字符?
【发布时间】:2013-02-19 05:20:09
【问题描述】:

我想将一个 unsigned int 转换成 2 个字符。例如:如果整数为 1,则其二进制表示为 0000 0001。我希望一个 char 变量中的 0000 部分和另一个二进制变量中的 0001 部分。我如何在 C 中实现这一点?

【问题讨论】:

  • 你在哪个平台上?在我们今天使用的大多数 PC 上,int 的大小通常为 4char 1。如果您确定它的大小为 2,那么您不太可能不熟悉按位技巧。
  • 看来您总共有 8 位(一个字节)并且您将其分成两个 4 位值,但是您的帖子标题表明您有两个字节。

标签: c


【解决方案1】:

如果你坚持你有一个sizeof(int)==2 那么:

  unsigned int x = (unsigned int)2; //or any other value it happens to be
  unsigned char high = (unsigned char)(x>>8);
  unsigned char low  = x & 0xff;

如果您总共有 8 位(一个字节)并且您将其分成两个 4 位值:

  unsigned char x=2;// or whatever
  unsigned char high = (x>>4);
  unsigned char low = x & 0xf;

【讨论】:

    【解决方案2】:

    移动并屏蔽您想要的数字部分。无符号整数可能是四个字节,如果您想要所有四个字节,您只需将高位字节移动 16 和 24。

    unsigned char low  =  myuint       & 0xff;
    unsigned char high = (myuint >> 8) & 0xff;
    

    【讨论】:

      【解决方案3】:

      这是假设使用 sizeof 进行 16 位整数检查!在我的平台上,整数是 32 位的,所以我将在这个代码示例中使用一个简短的。我的因拆开指针而获得最恶心奖 - 但它也是我最清楚地理解的。

      unsigned short number = 1;
      
      unsigned char a;
      a = *((unsigned char*)(&number)); // Grab char from first byte of the pointer to the int
      
      unsigned char b;
      b = *((unsigned char*)(&number) + 1); // Offset one byte from the pointer and grab second char
      

      【讨论】:

      • 这个真的是开箱即​​用! :)
      • 请注意,它取决于平台哪些字节进入每个chars。
      • @Volte - true 基于字节序,a 或 b 将包含 0001 或者更准确地说只是 1
      【解决方案4】:

      一种有效的方法如下:

      typedef union 
      {
        unsigned char c[sizeof(int)];
        int           i;
      } intchar__t;
      
      intchar__t x;
      x.i = 2;
      

      现在 x.c[](一个数组)会将整数引用为一系列字符,尽管您将遇到字节端序问题。这些可以通过您正在编程的平台使用适当的#define 值来解决。这类似于 Justin Meiners 提供的答案,但更简洁一些。

      【讨论】:

        【解决方案5】:
        unsigned short s = 0xFFEE;
        unsigned char b1 = (s >> 8)&0xFF;
        unsigned char b2 = (((s << 8)>> 8) & 0xFF);
        

        我能想到的最简单的。

        【讨论】:

        • 你有什么特别的原因> 8?如果那是为了推掉额外的位,那么最后的 0xFF 不会这样做吗?
        • @RyanPendleton true.. 我只是想确定一下.. 仅此而已。
        【解决方案6】:
        int i = 1  // 2 Byte integer value 0x0001
        unsigned char byteLow = (i & 0x00FF); 
        unsinged char byteHigh = ((i & 0xFF00) >> 8); 
        

        byteLow 中的值为 0x01byteHigh 中的值为 0x00

        【讨论】:

          猜你喜欢
          • 2013-06-08
          • 2020-12-18
          • 1970-01-01
          • 1970-01-01
          • 2022-05-11
          • 2021-03-14
          • 2011-02-09
          • 1970-01-01
          • 2011-08-10
          相关资源
          最近更新 更多