c++基本类型与 byte数组互转_c++ byte数组-程序员宅基地

技术标签: c++  类型转换  

c++ 基本类型与byte 数组互相转换

前言

	由于根据编译器的不同 有部分基础数据类型字节数不一致
	本文档 基础类型位数如下
		bool 字节数: 1
		char 字节数: 1
		short 字节数: 2
		int 字节数: 4
		long 字节数: 4
		long long 字节数: 8
		float 字节数: 4
		double 字节数: 8
		long double 字节数: 12

说明

传统C方式  位操作: 使用一个unsigned int变量来作为位容器。
	强制指针类型转换。
由于C++ 中没有Bety 类型  所以  typedef  unsigned char byte;

INT 与 byte数组互转

    /**
    * convert int type to  byte array
    */
    static void  intToByte(int i, byte* bytes);


    /**
    * convert byte array to int type
    */
    static int bytesToInt(byte* bytes);

void ByteUtil::intToByte(int i, byte* bytes)
{


   size_t length = sizeof(int);
	// 初始化数组
    memset(bytes, 0, sizeof(byte) * length);
    bytes[0] = (byte)(0xff & i);
    bytes[1] = (byte)((0xff00 & i) >> 8);
    bytes[2] = (byte)((0xff0000 & i) >> 16);
    bytes[3] = (byte)((0xff000000 & i) >> 24);
    return;
}

int ByteUtil::bytesToInt(byte* bytes)
{
    // 位操作时 使用一个unsigned int变量来作为位容器。
    int addr = bytes[0] & 0xFF;
    addr |= ((bytes[1] << 8) & 0xFF00);
    addr |= ((bytes[2] << 16) & 0xFF0000);
    addr |= ((bytes[3] << 24) & 0xFF000000);
    return addr;
}

long与 byte数组互转

    /**
    * convert long type to  byte array
    */
    static void  longToByte( long i, byte* bytes);


    /**
    * convert byte array to long type
    */
    static long bytesToLong(byte* bytes);


void ByteUtil::longToByte(long i, byte *bytes)
{
    // 位操作时 使用一个unsigned int变量来作为位容器。
    size_t length = sizeof(long);
    memset(bytes, 0, sizeof(byte) * length);
    bytes[0] = (byte)(0xff & i);
    bytes[1] = (byte)((0xff00 & i) >> 8);
    bytes[2] = (byte)((0xff0000 & i) >> 16);
    bytes[3] = (byte)((0xff000000 & i) >> 24);
}

long ByteUtil::bytesToLong(byte *bytes)
{
    
    // 位操作时 使用一个unsigned int变量来作为位容器。
     long addr = bytes[0] & 0xFF;
    addr |= ((bytes[1] << 8) & 0xFF00);
    addr |= ((bytes[2] << 16) & 0xFF0000);
    addr |= ((bytes[3] << 24) & 0xFF000000);
    
    return addr;
}


LONG LONG 与 byte数组互转

    /**
    * convert long long type to  byte array
    */
    static void  longLongToByte( long long i, byte* bytes);


    /**
    * convert byte array to long long type
    */
    static long long bytesToLongLong(byte* bytes);



void ByteUtil::longLongToByte(long long i, byte* bytes)
{
    // 位操作时 使用一个unsigned int变量来作为位容器。
    size_t length = sizeof(long long);
    memset(bytes, 0, sizeof(byte) * length);
    bytes[0] = (byte)(0xff & i);
    bytes[1] = (byte)((0xff00 & i) >> 8);
    bytes[2] = (byte)((0xff0000 & i) >> 16);
    bytes[3] = (byte)((0xff000000 & i) >> 24);
    bytes[4] = (byte)((0xff00000000 & i) >> 32);
    bytes[5] = (byte)((0xff0000000000 & i) >> 40);
    bytes[6] = (byte)((0xff000000000000 & i) >> 48);
    bytes[7] = (byte)((0xff00000000000000 & i) >> 56);
}

long long ByteUtil::bytesToLongLong(byte* bytes)
{

    // 位操作时 使用一个unsigned int变量来作为位容器。
    long long addr = bytes[0] & 0xFF;
    addr |= ((bytes[1] << 8) & 0xFF00);
    addr |= ((bytes[2] << 16) & 0xFF0000);
    addr |= ((bytes[3] << 24) & 0xFF000000);
    addr |= ((((long long) bytes[4]) << 32) & 0xFF00000000);
    addr |= ((((long long) bytes[5]) << 40) & 0xFF0000000000);
    addr |= ((((long long) bytes[6]) << 48) & 0xFF000000000000);
    addr |= ((((long long) bytes[7]) << 56) & 0xFF00000000000000);
    return addr;
}

short 与 byte数组互转

 /**
    * convert Short type to  byte array
    */
    static void  shortToByte(short i, byte* bytes);


    /**
    * convert byte array to Short type
    */
    static short bytesToShort(byte* bytes);


void ByteUtil::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);
    return;


}

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

double 与 byte数组互转

/**
    * convert byte array to double type
    */
    static double bytesToDouble(byte bytes[]);

    /**
    *  c++ double type length is 8 byte
    *	 convert  double type to byte array
    */
    static void doubleTobytes(double data, byte bytes[]);


double ByteUtil::bytesToDouble(byte bytes[])
{
    // 位操作时 使用一个unsigned int变量来作为位容器。
    double data = *((double*)bytes);
    return data;
}

void ByteUtil::doubleTobytes(double data, byte bytes[])
{
    // 位操作时 使用一个unsigned int变量来作为位容器。
    int i;

    size_t length = sizeof(double);

    char* p = (char*)&data;
    for (i = 0; i < length; i++)
    {
        bytes[i] = *p++;
    }
}

long double 与 byte数组互转


  /**
    * convert byte array to double type
    */
    static long double bytesToLongDouble(byte bytes[]);

    /**
    *  c++ double type length is 8 byte
    *	 convert  long double type to byte array
    */
    static void longDoubleTobytes(long double data, byte bytes[]);


long double ByteUtil::bytesToLongDouble(byte bytes[])
{
    // 位操作时 使用一个unsigned int变量来作为位容器。
   long double data = *((long double *)bytes);
   return data;
}

void ByteUtil::longDoubleTobytes(long double data, byte bytes[])
{

    // 位操作时 使用一个unsigned int变量来作为位容器。
    int i;

    size_t length = sizeof(long double);

    char* p = (char*)&data;
    for (i = 0; i < length; i++)
    {
        bytes[i] = *p++;
    }

}

float 与 byte数组互转

 /**
    * convert byte array to float  type
    * C语言可用
    */
    static float  bytesToFloat(byte bytes[]);

    /**
    *	 convert  float type to byte array
    */
    static void floatTobytes(float  data, byte bytes[]);


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

}

void RKByteUtil::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;
}



bool与 byte数组互转

    /**
    * convert byte array to bool  type
    * C语言可用
    */
    static bool  bytesToBool(byte bytes[]);

    /**
    *
    *	 convert  bool type to byte array
    */
    static void boolTobytes(bool  data, byte bytes[]);



bool ByteUtil::bytesToBool(byte bytes[])
{
    return (bytes[0] & 0x01) == 1 ? true : false;
}

void ByteUtil::boolTobytes(bool data, byte bytes[])
{

    if (data) {
        bytes[0] = (byte)(0x01 & 1);
    }
    else {
        bytes[0] = (byte)(0x01 & 0);
    }

}

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_27216267/article/details/114015475

智能推荐

Couldn't open file /etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-7-程序员宅基地

文章浏览阅读1.5k次。Couldn’t open file /etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-7CentOS7安装任何软件,比如yum -y install ansible出现错误信息:Couldn't open file /etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-7名词解释:EPEL:extra packages for enterprise l..._couldn't open file /etc/pki/rpm-gpg/rpm-gpg-key-epel-7

Windows添加右键在此处打开命令行_右键 在windows终端打开-程序员宅基地

文章浏览阅读1.9k次,点赞2次,收藏2次。一键自动导入设置。将以下内容保存成reg文件,如a.reg,双击该文件自动导入设置。Windows Registry Editor Version 5.00[HKEY_CLASSES_ROOT\Directory\Background\shell\OpenCMDHere]"ShowBasedOnVelocityId"=dword:00639bc8[HKEY_CLASSES_ROOT\..._右键 在windows终端打开

Mac 如何干净的卸载 VMware Fusion_macbook中vmware fusion怎么卸载-程序员宅基地

文章浏览阅读9.1k次。# 1. 删除根目录下的,需要用管理员权限sudo rm -rf /Applications/VMware\ Fusion.appsudo rm -rf /Library/Application\ Support/VMwaresudo rm -rf /Library/Preferences/VMware\ Fusionsudo rm -rf /Library/Logs/VMware/s..._macbook中vmware fusion怎么卸载

js用递归遍历多维数组_JS数组的遍历上 (含forEach等方法源码)-程序员宅基地

文章浏览阅读3.5k次。forEach()方法用于调用数组的每个元素(循环遍历数组中的每一个元素),并将元素传递给回调函数。它内部的回调函数可以传入三个参数:function(item, index, arr)item为必填参数,表示当前元素index为可选参数,表示当前元素的索引arr同样为可选参数,表示当前元素所属的数组对象(正在遍历的这个数组)。forEach源码实现:Array.prototype.myForEa..._js递归遍历多维数组

android的apk在oppo手机无法安装(安装包没有签名文件)-程序员宅基地

文章浏览阅读2.6k次。在华为手机可以安装,却在oppo手机无法安装,这是怎么回事呢?原来在打包问题上之前仅仅只勾选了第二个,现在把两个都勾上,然后打包安装到oppo手机,完美解决!========================================Talk is cheap, show me the code============================..._oppo安装不了apk文件

什么才是物联网领域最好的开发语言?_micropython和c++执行效率对比-程序员宅基地

文章浏览阅读5k次。采用C/C++语言,运行最快,一般采用厂家提供的底层驱动支持包BSP,所有MCU都支持。最近很多小伙伴找我,说想要一些物联网学习资料,然后我根据自己从业十年经验,熬夜搞了几个通宵,精心整理了一份「物联网入门到高级教程+工具包」,点个关注,全部无偿共享给大家!采用uLISP语言,利用神奇的LISP语言,函数式编程,开发效率高,运行效率也较好。采用microPython语言,软件开发效率可提高5倍以上,但运行效率一般,有时需要优化,容易学习,需要选择microPython支持的MCU。_micropython和c++执行效率对比

随便推点

语音识别系列7-chain model 之分子部分_chain model原理-程序员宅基地

文章浏览阅读1.3k次。一、简介现在有越来越多的公司和团体开始使用chain model了,得益于kaldi社区日益活跃和kaldi作者povey的大力推荐,chain model的优越性在于:1,使用了单状态的biphone,建模粒度更大,有些类似于CTC;2,采用的低帧率策略,DNN每三帧输出一次,解码速度更快;3,使用了区分性训练,准确率更高;4,改进了MMI,提出了Lattice free MMI,训练速度更..._chain model原理

Windows DPAPI 数据加密保护接口详解-程序员宅基地

文章浏览阅读8.1k次,点赞2次,收藏9次。1 什么是DPAPI DPAPI是Windows系统级对数据进行加解密的一种接口,无需自实现加解密代码,微软已经提供了经过验证的高质量加解密算法,提供了用户态的接口,对密钥的推导,存储,数据加解密实现透明,并提供较高的安全保证。 DPAPI提供了两个用户态接口,`CryptProtectData`加密数据,`CryptUnprotectData`解密数据,加密后的数据由应用程序负责安..._dpapi

Python实现cmd命令连续执行_如何写一个一直执行的进程cmd-程序员宅基地

文章浏览阅读4k次,点赞2次,收藏5次。之前是想写一个微信控制程序,通过登录网页微信,可以直接执行命令行代码。也不用ssh登录了,想法很方便。但是现实很残酷,微信登录这块基本没有问题,已经有大佬写好了,但是命令行执行遇到问题了。运行cmd开始时,使用os.popen()执行命令,但是该命令需要手动修改运行目录。此方案被我直接丢弃了。单开进程那么自然想到通过启动进程的方式来实现,Python有对进程的封装subproc..._如何写一个一直执行的进程cmd

计算机网络之Cisco Packet Tracer仿真实验_计算机网络划分子接口仿真-程序员宅基地

文章浏览阅读9.5k次,点赞22次,收藏96次。本文目的是通过在Cisco Packet Tracer(CPT)软件平台上进行网络的规划和配置,熟悉计算机网络的搭建过程并对计算机网络有更加深入的了解。目录(一)Cisco Packet Tracer(CPT)简介(一)Cisco Packet Tracer(CPT)简介CPT借助思科构建的功能强大的网络仿真工具,可以让我们获得真实的体验。通过练习在各种设备上构建简单而复杂的网络,并扩展到路由器和交换机之外,创建可与智能城市,家庭和企业互连的解决方案。思科Packet Tracer..._计算机网络划分子接口仿真

Tensorflow下用自己的数据集对Faster RCNN进行训练和测试(二)-程序员宅基地

文章浏览阅读2.5w次,点赞3次,收藏127次。对于Tensorflow版本的Faster RCNN网络,网上包括github上都有不同的源码版本,本人之前也在进行不同版本的运行测试,可以说是每个版本都有不同的错误,在解决这些错误时可谓道阻且长。而对于用自己的数据集来训练和测试Faster RCNN网络,本人在之前的博客https://blog.csdn.net/hitzijiyingcai/article/details/81808091中已...

jq 穿梭框_jq穿梭框-程序员宅基地

文章浏览阅读1.1k次。#HTML代码&lt;!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"&gt;&lt;html xmlns="http://www.w3.org/1999/xhtml"&gt;&lt;head&gt;&am_jq穿梭框

推荐文章

热门文章

相关标签