IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> c++ byte与short、int、float互相转化 -> 正文阅读

[C++知识库]c++ byte与short、int、float互相转化

参考:

  1. 一文穷尽所有C++的数据类型
  2. C++ 类型转换(内置类型,string、char*、const char*等)
  3. c++基本类型与 byte数组互转(***)
  4. C++中将char数组转换成double类型的方法(***)
  5. C语言中的类型转换(***)
  6. C语言中的整数(short,int,long)
  7. 数组万能复制——memcpy()
  8. 使用memcpy 复制unsigned int 型的数据
  9. [c++]数据类型之间的转换(string与基本类型int,float,double,long long等)(***)
  10. c/c++ bytes与int,short,long,float,double相互转换(**)

正文:
方法一:
采用函数来进行转化
c++ 中没有byte类型,先要定义byte

typedef unsigned char byte;

转化函数:


void shortToByte(short i, byte* bytes)
{

    // 位操作时 使用一个unsigned int变量来作为位容器。
    size_t length = sizeof(short);

    //byte[] bytes = new byte[4];
    memset(bytes, 0, sizeof(byte) * length);
    bytes[0] = (byte)(0xff & i);
    bytes[1] = (byte)((0xff00 & i) >> 8);

}

short bytesToShort(byte* bytes)
{
    // 位操作时 使用一个unsigned int变量来作为位容器。
    short addr = bytes[0] & 0xFF;
    addr |= ((bytes[1] << 8) & 0xFF00);
    return addr;
}

void intToBytes(int i, byte* bytes) {
    // byte[] bytes = new byte[4];
    int size = sizeof(int);
    memset(bytes,0,sizeof(byte) *  size);
    bytes[0] = (byte) (0xff & i);
    bytes[1] = (byte) ((0xff00 & i) >> 8);
    bytes[2] = (byte) ((0xff0000 & i) >> 16);
    bytes[3] = (byte) ((0xff000000 & i) >> 24);
}

int bytesToInt(byte* bytes) {

    int iRetVal = bytes[0] & 0xFF;
    iRetVal |= ((bytes[1] << 8) & 0xFF00);
    iRetVal |= ((bytes[2] << 16) & 0xFF0000);
    iRetVal |= ((bytes[3] << 24) & 0xFF000000);

    return iRetVal;
}


float bytesToFloat(byte bytes[])
{
    // 位操作时 使用一个unsigned int变量来作为位容器。
    return *((float*)bytes);

}

void floatTobytes(float data, byte bytes[])
{
    // 位操作时 使用一个unsigned int变量来作为位容器。
    int i;
    size_t length = sizeof(float);


    byte *pdata = (byte*)&data; //把float类型的指针强制转换为unsigned char型
    for (i = 0; i < length; i++)
    {
        bytes[i] = *pdata++;//把相应地址中的数据保存到unsigned char数组中
    }
    return;
}

主函数:
先复习一下基础知识:

         
              char   1 byte    -128 ~ 127
     unsigned char   1 byte       0 ~ 255
       signed char   1 byte    -128 ~ 127
        short int    2 byte  -32768 ~ 32767
int main(){
	
	std::cout << "...short <==> byte... " << std::endl;
    short i = 124;
    byte ch[2];
    shortToByte(i,ch);
    short b = bytesToShort(ch);
    std::cout << (short)ch[0] << std::endl;
    std::cout << b << std::endl;

	std::cout << "...int  <==> byte... " << std::endl;
    int i1 = 40000;
    byte ch1[4];
    intToBytes(i1,ch1);
	int i12 = bytesToInt(ch1);
    std::cout << (int)ch1[0] << std::endl;
    std::cout << i12 << std::endl;

    std::cout << "...float <==> byte... " << std::endl;
    float f1 = 9600.17;
    byte ch2[4];
    floatTobytes(f1,ch2);
    std::cout << "sizeof(ch2): " << sizeof(ch2) << std::endl;
    float f12 = bytesToFloat(ch2);
    std::cout << (float)ch2[0] << std::endl;
    std::cout << f12 << std::endl;
    
	return 0}

结果输出:

...short <==> byte... 
124
124
...int  <==> byte... 
64
40000
...float <==> byte... 
sizeof(ch2)4
174
9600.17

shortByte互转过程中,
if 0 <= short i <= 255, then ** (short)ch[0]** 等于**short i

复制到byte数组时:

byte sendData[16] = { 0 };
memcpy(sendData,ch,2);
memcpy(sendData+2,ch1,4);
memcpy(sendData+6,ch2,4);

short data1 = bytesToShort(sendData);
int data2 = bytesToInt(sendData+2);
float data3 = bytesToFloat(sendData+6);

std::cout << data1 << " " << data2 << " " << data3 << std::endl;

其结果为:

124 40000 9600.17

方法二:
利用联合体union的特性转化
先定义联合体 union short2byte

union short2byte
{
    unsigned char byte[2];
    short value;
};

在主函数中,接着上面的byte 数组sendData

short2byte x;
x.value = 32767;
memcpy(sendData+10,x.byte,2);

可以这样转化

short data4 = bytesToShort(sendData+10);
std::cout << data4<< std::endl;

也可以这样转化

short2byte x1;
memcpy(x1.byte,sendData+10,2);
std::cout << x1.value << std::endl;

打印结果:

data4: 32767
x1.value: 32767
  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2022-05-07 11:00:54  更:2022-05-07 11:01:07 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/21 2:45:56-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码