C++中 unsigned char != byte

本文探讨了C++中byte类型的定义方式及其潜在的问题。通过示例说明了使用unsigned char作为byte时可能出现的意外结果,并提供了如何正确转换和打印byte类型的建议。

C++中不存在内建的byte类型,通常我们会通过

typedef unsigned char byte;

这一类的方式来定义byte类型,但就此认为unsigned char可以完全代表byte类型,就得注意了。

byte a = 0x30;

cout<<a<<endl;

我们期待输出是什么,期待输出0x30,实在不行好歹也输出个48吧,出乎意料的是输出0.

0的ASCII码是0x30,这里把a当作unsigned char处理了,

所有这里认为a = ‘0’;

这个错误不算隐蔽,因为看得见输出,能很快定位错误

    class StringHelper
    {
    public:
       template<typename T>
       static String Convert(T t)
       {
           std::ostringstream os;
           os<<t;
           return os.str();
       }

       template<typename R>
       static R Convert(String str)
       {
           std::istringstream is(str);
           R result;
           is>>result;
           return result;
       }

 

。。。。。。。。。。。。。。。。。。。。。。

string data = "1";

byte a = StringHelper::Convert<byte>(data);

如果你这么干,那么你也会和我一样倒大霉了 ~>_<~

 

请你判断一下我下面这个代码是否也可以是实现modbus CRC16 class LFSR { public: LFSR() : state(0) {} unsigned short Run(const vector<int>& polylist, unsigned short seed, int clknum, const vector<unsigned char>& inputdata, int outputreverse, unsigned short xorout) { state = seed; for (int i = 0; i < clknum; ++i) { int bit = (state >> 15) & 0x01; state <<= 1; if (bit) { state ^= 0x8005; } } state ^= xorout; if (outputreverse) { state = reverseBits(state); } return state; } private: unsigned short state; unsigned short reverseBits(unsigned short value) { unsigned short reversed = 0; for (int i = 0; i < 16; ++i) { reversed = (reversed << 1) | (value & 1); value >>= 1; } return reversed; } }; vector<unsigned char> CrcModbus(vector<unsigned char> data) { vector<unsigned char> new_data = data; unsigned short poly = 0x8005; int polywidth = 16; int bits_in_byte = 8; vector<int> polylist; polylist.push_back(polywidth); for (int idx = 0; idx < polywidth; ++idx) { if ((poly & (1 << idx)) && (idx != 0)) { polylist.insert(polylist.begin() + 1, idx); } } for (int idx = 0; idx < data.size(); ++idx) { unsigned char src = data[idx]; unsigned char reversed_byte = 0; for (int bit = 0; bit < bits_in_byte; ++bit) { reversed_byte = (reversed_byte << 1) | (src & 1); src >>= 1; } data[idx] = reversed_byte; } LFSR lfsr; unsigned short crcvalue = lfsr.Run(polylist, 0xffff, data.size() * bits_in_byte, data, 1, 0x0000); unsigned char low = crcvalue & 0xFF; new_data.push_back(low); unsigned char high = (crcvalue >> 8) & 0xFF; new_data.push_back(high); return new_data; }
最新发布
05-21
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值