• 首页 首页 icon
  • 工具库 工具库 icon
    • IP查询 IP查询 icon
  • 内容库 内容库 icon
    • 快讯库 快讯库 icon
    • 精品库 精品库 icon
    • 问答库 问答库 icon
  • 更多 更多 icon
    • 服务条款 服务条款 icon

C语言8位、16位、32位数据转换

武飞扬头像
位文杰TOP
帮助1

先看一下测试代码

  1.  
    #include <stdio.h>
  2.  
     
  3.  
    int main()
  4.  
    {
  5.  
    /* Write C code in this online editor and run it. */
  6.  
    int WifiIPSet=0;
  7.  
    int WifiIPSet1=0;
  8.  
    int WifiIPSet2=0;
  9.  
    int WifiIPSet3=0;
  10.  
    int Ip_data=0x12345678;
  11.  
    int Ip_data1=0;
  12.  
    int Ip_data2=0;
  13.  
    int Ip_data3=0;
  14.  
    int Ip_data4=0;
  15.  
    Ip_data1=((Ip_data >> 24) & 0xff);
  16.  
    Ip_data2=((Ip_data >> 16) & 0xff);
  17.  
    Ip_data3=((Ip_data >> 8) & 0xff);
  18.  
    Ip_data4=((Ip_data ) & 0xff);
  19.  
    printf("Ip_data1=%hX\r\n",Ip_data1);
  20.  
    printf("Ip_data2=%hX\r\n",Ip_data2);
  21.  
    printf("Ip_data3=%hX\r\n",Ip_data3);
  22.  
    printf("Ip_data4=%hX\r\n",Ip_data4);
  23.  
    WifiIPSet=((Ip_data1<<8) |((Ip_data2)));
  24.  
    WifiIPSet1=((Ip_data2<<8)|((Ip_data3)));
  25.  
    printf("WifiIPSet=%hX\r\n",WifiIPSet);
  26.  
    printf("WifiIPSet1=%hX\r\n",WifiIPSet1);
  27.  
    WifiIPSet2 = (Ip_data1<<24)|(Ip_data2<<16)|(Ip_data3<<8)|(Ip_data4);
  28.  
    WifiIPSet3 = ((WifiIPSet << 16) )| (WifiIPSet1);
  29.  
    printf("WifiIPSet2=%2X\r\n",WifiIPSet2);
  30.  
    printf("WifiIPSet3=%X\r\n",WifiIPSet3);
  31.  
    return 0;
  32.  
    }
学新通

输出结果

  1.  
    Ip_data1=12
  2.  
    Ip_data2=34
  3.  
    Ip_data3=56
  4.  
    Ip_data4=78
  5.  
    WifiIPSet=1234
  6.  
    WifiIPSet1=3456
  7.  
    WifiIPSet2=12345678
  8.  
    WifiIPSet3=12343456
  9.  
     
  10.  
     

一、移位法

8位转16位

将2个8位数据high、low合成一个16位数据data_u16:

data_u16 = (high<<8) | low;

16位转8位

将一个16位数据data_u16拆分成2个8位数据high、low:

data_u16 = (high<<8) | low;

  1.  
    high = (data_u16 >> 8) & 0xff; //高8位
  2.  
    low = data_u16 & 0xff; //低8位

8位转32位

将4个8位数据data_u8[4]合成一个32位数据data_u32:

  1.  
    8位转32
  2.  
    48位数据data_u8[4]合成一个32位数据data_u32

32位转8位

将一个32位数据data_u32拆分成4个8位数据data_u8[4]:

  1.  
    data_u8[0] = (data_u32 >> 24) & 0xff;
  2.  
    data_u8[1] = (data_u32 >> 16) & 0xff;
  3.  
    data_u8[2] = (data_u32 >> 8) & 0xff;
  4.  
    data_u8[3] = data_u32 & 0xff;
  5.  
    //高位在前,低位在后

16位转32位

将2个16位数据data_u16[2]合成一个32位数据data_u32:

data_u32 = (data_u16[0]<<16)|data_u16[1];

32位转16位

将一个32位数据data_u32拆分成2个16位数据data_u16[2]:

  1.  
    data_u16[0] = (data_u32 >> 16) & 0xffff; //高16位
  2.  
    data_u16[1] = data_u32 & 0xffff; //低16位

二、共用体法

运用共用体共享内存的特性,实现转换。
不了解共用体的朋友,可以点击下方蓝色链接,文章里有详细的讲解。

C语言:关键字—union(声明共用体类型)

16位 与 8位 互转

  1.  
    #include <stdio.h>
  2.  
     
  3.  
    typedef unsigned char uint8_t;
  4.  
    typedef unsigned short int uint16_t;
  5.  
    typedef unsigned int uint32_t;
  6.  
     
  7.  
    //声明共用体
  8.  
    typedef union
  9.  
    {
  10.  
    uint8_t data8[2];
  11.  
    uint16_t data16;
  12.  
    } _MQ;
  13.  
    //定义共用体变量
  14.  
    _MQ mq ;
  15.  
     
  16.  
    int main(void)
  17.  
    {
  18.  
    /***************************16位转8位*******************************/
  19.  
    mq.data16 = 0x1234;//给16位数据赋值
  20.  
     
  21.  
    printf("data16=0x%x\n\n",mq.data16);//输出16位数据数值
  22.  
     
  23.  
    printf("data8[0]=0x%x\n",mq.data8[0]);//输出低8位数据数值
  24.  
    printf("data8[1]=0x%x\n\n",mq.data8[1]);//输出高8位数据数值
  25.  
     
  26.  
    /***************************8位转16位*******************************/
  27.  
    mq.data8[0] = 0x78;//给8位数据0赋值
  28.  
    mq.data8[1] = 0x56;//给8位数据1赋值
  29.  
     
  30.  
    printf("data8[0]=0x%x\n",mq.data8[0]);//输出低8位数据数值
  31.  
    printf("data8[1]=0x%x\n\n",mq.data8[1]);//输出高8位数据数值
  32.  
     
  33.  
    printf("data16=0x%x\n\n",mq.data16);//输出16位数据数值
  34.  
     
  35.  
    return 0;
  36.  
    }
学新通

学新通

32位 与 16位 互转

具体代码如下:

  1.  
    #include <stdio.h>
  2.  
     
  3.  
    typedef unsigned char uint8_t;
  4.  
    typedef unsigned short int uint16_t;
  5.  
    typedef unsigned int uint32_t;
  6.  
     
  7.  
    //声明共用体
  8.  
    typedef union
  9.  
    {
  10.  
    uint16_t data16[2];
  11.  
    uint32_t data32;
  12.  
    } _MQ;
  13.  
    //定义共用体变量
  14.  
    _MQ mq ;
  15.  
     
  16.  
    int main(void)
  17.  
    {
  18.  
    /***************************32位转16位*******************************/
  19.  
    mq.data32 = 0x12345678;//给32位数据赋值
  20.  
     
  21.  
    printf("data32=0x%x\n\n",mq.data32);//输出32位数据数值
  22.  
     
  23.  
    printf("data16[0]=0x%x\n",mq.data16[0]);//输出低16位数据数值
  24.  
    printf("data16[1]=0x%x\n\n",mq.data16[1]);//输出高16位数据数值
  25.  
     
  26.  
    /***************************16位转32位*******************************/
  27.  
    mq.data16[0] = 0x3344;//给16位数据0赋值
  28.  
    mq.data16[1] = 0x1122;//给16位数据1赋值
  29.  
     
  30.  
    printf("data16[0]=0x%x\n",mq.data16[0]);//输出低8位数据数值
  31.  
    printf("data16[1]=0x%x\n\n",mq.data16[1]);//输出高8位数据数值
  32.  
     
  33.  
    printf("data32=0x%x\n\n",mq.data32);//输出16位数据数值
  34.  
     
  35.  
    return 0;
  36.  
    }
学新通

学新通

32位 与 8位 互转

具体代码如下:

  1.  
    #include <stdio.h>
  2.  
     
  3.  
    typedef unsigned char uint8_t;
  4.  
    typedef unsigned short int uint16_t;
  5.  
    typedef unsigned int uint32_t;
  6.  
     
  7.  
    //声明共用体
  8.  
    typedef union
  9.  
    {
  10.  
    uint8_t data8[4];
  11.  
    uint32_t data32;
  12.  
    } _MQ;
  13.  
    //定义共用体变量
  14.  
    _MQ mq ;
  15.  
     
  16.  
    int main(void)
  17.  
    {
  18.  
    /***************************32位转8位*******************************/
  19.  
    mq.data32 = 0x12345678;//给32位数据赋值
  20.  
     
  21.  
    printf("data32=0x%x\n\n",mq.data32);//输出32位数据数值
  22.  
     
  23.  
    //输出8位数据,低字节在前,高字节在后。
  24.  
    printf("data8[0]=0x%x\n",mq.data8[0]);
  25.  
    printf("data8[1]=0x%x\n",mq.data8[1]);
  26.  
    printf("data8[2]=0x%x\n",mq.data8[2]);
  27.  
    printf("data8[3]=0x%x\n\n",mq.data8[3]);
  28.  
     
  29.  
    /***************************8位转32位*******************************/
  30.  
    mq.data8[0] = 0x11;//给8位数据0赋值
  31.  
    mq.data8[1] = 0x22;//给8位数据1赋值
  32.  
    mq.data8[2] = 0x33;//给8位数据2赋值
  33.  
    mq.data8[3] = 0x44;//给8位数据3赋值
  34.  
     
  35.  
    printf("data8[0]=0x%x\n",mq.data8[0]);
  36.  
    printf("data8[1]=0x%x\n",mq.data8[1]);
  37.  
    printf("data8[2]=0x%x\n",mq.data8[2]);
  38.  
    printf("data8[3]=0x%x\n\n",mq.data8[3]);
  39.  
     
  40.  
    printf("data32=0x%x\n\n",mq.data32);//输出32位数据数值
  41.  
     
  42.  
    return 0;
  43.  
    }
学新通

学新通

C语言输出数据的格式C语言中的二进制数、八进制数和十六进制数

  1.  
    #include <stdio.h>
  2.  
    int main()
  3.  
    {
  4.  
    short a = 0b1010110; //二进制数字
  5.  
    int b = 02713; //八进制数字
  6.  
    long c = 0X1DAB83; //十六进制数字
  7.  
     
  8.  
    printf("a=%ho, b=%o, c=%lo\n", a, b, c); //以八进制形似输出
  9.  
    printf("a=%hd, b=%d, c=%ld\n", a, b, c); //以十进制形式输出
  10.  
    printf("a=%hx, b=%x, c=%lx\n", a, b, c); //以十六进制形式输出(字母小写)
  11.  
    printf("a=%hX, b=%X, c=%lX\n", a, b, c); //以十六进制形式输出(字母大写)
  12.  
    return 0;
  13.  
    }
  1.  
    运行结果:
  2.  
    a=126, b=2713, c=7325603
  3.  
    a=86, b=1483, c=1944451
  4.  
    a=56, b=5cb, c=1dab83
  5.  
    a=56, b=5CB, c=1DAB83

C语言中的二进制数、八进制数和十六进制数

1.C语言中的二进制数、八进制数和十六进制数

  1.  
    >>8) & 0xFF中的 >> 和 &0xFF 的作用
  2.  
    参考:https://blog.csdn.net/iamgamer/article/details/79354617
  3.  
     
  4.  
    其中有两个位运算,一个是>>,一个是&。
  5.  
     
  6.  
    0xff的作用一:
  7.  
     
  8.  
    十六进制0xff的长度是一个字节,即八位,二进制为:1111 1111,那么一个 8bit 数与1111 1111与运算还是这个数本身,但是一个16bit 数与 0xff就被截断了,比如 1100110011001100 & 0xff结果为 11001100。那如果想不被截断怎么办?把0xff扩展为二个字节即:0xffff,那么以此类推,0xffffff,0xffffffff都出来了。
  9.  
     
  10.  
    0xff的作用二:
  11.  
     
  12.  
    java专属,由于java没有unsigned类型,所以为了适应与其他语言二进制通讯时各种数据的一致性,需要做一些处理。
  13.  
     
  14.  
    最直观的例子:int a = -127 & 0xFF ; // 等同于 unsigned int c = 129; (这里的-127与129是字节,只为了直观而写的具体数字)
  15.  
     
  16.  
    这里要严格说明一点:再32位机器上,0xff实际上是 0x00000000 00000000 00000000 11111111
  17.  
     
  18.  
    -12711111111 11111111 11111111 10000001 (补码形式), 那么-127 & 0xff的结果自然是
  19.  
     
  20.  
    00000000 00000000 00000000 10000001129.
  21.  
     
  22.  
    简而言之,该作用主要是为了将 有符号数转换为无符号数。
  23.  
     
  24.  
    >>8的作用:
  25.  
     
  26.  
    这个是根据需求而定的,可以是>>8也可以是>>16,>>24,等等
  27.  
     
  28.  
    而跟 & 0xff运算的意义其实就是截断,将123456的高位右移8位,通过0xff截取出来。实际意义就是取字节,比如一个4字节的数,需要将每个字节内容取出来转换出目标数据,那么通过>> 并且 &0xff 运算 就可以去除想要的部分。
  29.  
     
  30.  
    再详细点:4字节 ,32 位,按照大端方式排列,
  31.  
     
  32.  
    最高位 最低位
  33.  
     
  34.  
    11111111 10101010 11000011 10101010
  35.  
     
  36.  
    最高位8字节要移到最低位那么,这个8个字节>>(3*8),然后与0xff运算,取出,然后后续得>>(2*8) & 0xff ;>>(1*8) & 0xff,均可取出。
学新通

这篇好文章是转载于:学新通技术网

  • 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
  • 本站站名: 学新通技术网
  • 本文地址: /boutique/detail/tanhgggfge
系列文章
更多 icon
同类精品
更多 icon
继续加载