项目场景:
这里简述项目相关背景:
与嵌入设备打交道,经常会使用移位、拷贝的运算符,对大小端没有清晰的认识会在不知不觉中写出bug
问题描述:
这里描述项目中遇到的问题:
在使用string 读取文件,然后将字符串buffer中的数据拷贝到unsigned short*
指针中,如下:
#include <iostream>
#include <string>
#include "export.h"
#include <cstring>
using namespace std;
int main() {
string v_str("hello world");
std::cout << "v_str:"<<v_str << '\n';
std::cout << "size:"<<v_str.size() << '\n';
unsigned char *pdata=new unsigned char[v_str.size()];
memcpy(pdata,v_str.c_str(),v_str.size());
std::cout << "0:"<<hex<<(int)pdata[0] << '\n';
std::cout << "1:"<<hex<<(int)pdata[1] << '\n';
std::cout << "2:"<<hex<<(int)pdata[2] << '\n';
std::cout << "3:"<<hex<<(int)pdata[3] << '\n';
delete []pdata;
unsigned short *pshort=new unsigned short[5];
memcpy(pshort,v_str.c_str(),11);
std::cout << "0:"<<hex<<pshort[0] << '\n';
std::cout << "1:"<<pshort[1] << '\n';
std::cout << "2:"<<pshort[2] << '\n';
std::cout << "3:"<<pshort[3] << '\n';
std::cout << "0:"<<dec<<pshort[0] << '\n';
delete []pshort;
return 0;
}
输出
v_str:hello world
size:11
0:68
1:65
2:6c
3:6c
0:6568
1:6c6c
2:206f
3:6f77
0:25960
看到上面的输出就很费解,咋就顺序倒了一下
原因分析:
这里填写问题的分析:
上述问题就是由于没有认识到大小端的转换造成的。INTEL pc用的是小端模式,高位字节放在小端。而从string中的的buffer是单字节的,因此每两个字节会调换一下顺序。
类似的问题真是防不胜防。
解决方案:
这里填写该问题的具体解决方案:
对于以上问题,处理方法就是在拷贝完之后,对于每个unsigned short
进行两个字节的调换,如下
_data[i]=static_cast<unsigned short>(_data[i]<<8)|static_cast<unsigned short>(_data[i]>>8);