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;
/**
* 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;
}
/**
* 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;
}
/**
* 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;
}
/**
* 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;
}
/**
* 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++;
}
}
/**
* 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++;
}
}
/**
* 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;
}
/**
* 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);
}
}
文章浏览阅读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
文章浏览阅读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终端打开
文章浏览阅读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怎么卸载
文章浏览阅读3.5k次。forEach()方法用于调用数组的每个元素(循环遍历数组中的每一个元素),并将元素传递给回调函数。它内部的回调函数可以传入三个参数:function(item, index, arr)item为必填参数,表示当前元素index为可选参数,表示当前元素的索引arr同样为可选参数,表示当前元素所属的数组对象(正在遍历的这个数组)。forEach源码实现:Array.prototype.myForEa..._js递归遍历多维数组
文章浏览阅读2.6k次。在华为手机可以安装,却在oppo手机无法安装,这是怎么回事呢?原来在打包问题上之前仅仅只勾选了第二个,现在把两个都勾上,然后打包安装到oppo手机,完美解决!========================================Talk is cheap, show me the code============================..._oppo安装不了apk文件
文章浏览阅读5k次。采用C/C++语言,运行最快,一般采用厂家提供的底层驱动支持包BSP,所有MCU都支持。最近很多小伙伴找我,说想要一些物联网学习资料,然后我根据自己从业十年经验,熬夜搞了几个通宵,精心整理了一份「物联网入门到高级教程+工具包」,点个关注,全部无偿共享给大家!采用uLISP语言,利用神奇的LISP语言,函数式编程,开发效率高,运行效率也较好。采用microPython语言,软件开发效率可提高5倍以上,但运行效率一般,有时需要优化,容易学习,需要选择microPython支持的MCU。_micropython和c++执行效率对比
文章浏览阅读1.3k次。一、简介现在有越来越多的公司和团体开始使用chain model了,得益于kaldi社区日益活跃和kaldi作者povey的大力推荐,chain model的优越性在于:1,使用了单状态的biphone,建模粒度更大,有些类似于CTC;2,采用的低帧率策略,DNN每三帧输出一次,解码速度更快;3,使用了区分性训练,准确率更高;4,改进了MMI,提出了Lattice free MMI,训练速度更..._chain model原理
文章浏览阅读8.1k次,点赞2次,收藏9次。1 什么是DPAPI DPAPI是Windows系统级对数据进行加解密的一种接口,无需自实现加解密代码,微软已经提供了经过验证的高质量加解密算法,提供了用户态的接口,对密钥的推导,存储,数据加解密实现透明,并提供较高的安全保证。 DPAPI提供了两个用户态接口,`CryptProtectData`加密数据,`CryptUnprotectData`解密数据,加密后的数据由应用程序负责安..._dpapi
文章浏览阅读4k次,点赞2次,收藏5次。之前是想写一个微信控制程序,通过登录网页微信,可以直接执行命令行代码。也不用ssh登录了,想法很方便。但是现实很残酷,微信登录这块基本没有问题,已经有大佬写好了,但是命令行执行遇到问题了。运行cmd开始时,使用os.popen()执行命令,但是该命令需要手动修改运行目录。此方案被我直接丢弃了。单开进程那么自然想到通过启动进程的方式来实现,Python有对进程的封装subproc..._如何写一个一直执行的进程cmd
文章浏览阅读9.5k次,点赞22次,收藏96次。本文目的是通过在Cisco Packet Tracer(CPT)软件平台上进行网络的规划和配置,熟悉计算机网络的搭建过程并对计算机网络有更加深入的了解。目录(一)Cisco Packet Tracer(CPT)简介(一)Cisco Packet Tracer(CPT)简介CPT借助思科构建的功能强大的网络仿真工具,可以让我们获得真实的体验。通过练习在各种设备上构建简单而复杂的网络,并扩展到路由器和交换机之外,创建可与智能城市,家庭和企业互连的解决方案。思科Packet Tracer..._计算机网络划分子接口仿真
文章浏览阅读2.5w次,点赞3次,收藏127次。对于Tensorflow版本的Faster RCNN网络,网上包括github上都有不同的源码版本,本人之前也在进行不同版本的运行测试,可以说是每个版本都有不同的错误,在解决这些错误时可谓道阻且长。而对于用自己的数据集来训练和测试Faster RCNN网络,本人在之前的博客https://blog.csdn.net/hitzijiyingcai/article/details/81808091中已...
文章浏览阅读1.1k次。#HTML代码<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html xmlns="http://www.w3.org/1999/xhtml"><head>&am_jq穿梭框