signed unsigned 引发的血案
2014-05-21 10:12
211 查看
bug描述:
问题产生于局域网传输一幅图片。
服务端负责发送,是由另一个同事用C#写的,我用C++写接收客户端。
我们约定在传输一幅图片前,先传固定4个字节的size信息,然后传图片数据。
结果发现有些图片总是末尾坏掉一截或是干脆就传不过来。
bug原因:
在我接收到size[4]后,我采用了size = size[3]*256*256*256 + size[2]*256*256+size[1]*256+size[0]的方式来将字符串转换为整形。
但是size[4]是char型字符串,于是在char型字符和整形相乘的过程中,char型被自动转换成了signed int型,于是出现负数,导致size计算出错。
在每个字符前加(unsigned char)转换一下就正确了。
当然这里还有另外一种得到size的方式, 强制转换指针类型,然后直接取值:size = *((unsigned int *)size);
问题产生于局域网传输一幅图片。
服务端负责发送,是由另一个同事用C#写的,我用C++写接收客户端。
我们约定在传输一幅图片前,先传固定4个字节的size信息,然后传图片数据。
结果发现有些图片总是末尾坏掉一截或是干脆就传不过来。
bug原因:
在我接收到size[4]后,我采用了size = size[3]*256*256*256 + size[2]*256*256+size[1]*256+size[0]的方式来将字符串转换为整形。
但是size[4]是char型字符串,于是在char型字符和整形相乘的过程中,char型被自动转换成了signed int型,于是出现负数,导致size计算出错。
在每个字符前加(unsigned char)转换一下就正确了。
当然这里还有另外一种得到size的方式, 强制转换指针类型,然后直接取值:size = *((unsigned int *)size);
相关文章推荐
- 一段代码引发的血案
- 二进制(signed or unsigned)补码
- Android android.icu.* 包引发的血案
- 浮点数引发的Canvas绘制血案
- 一次oracle安全加固引发的血案
- android 的manageSpaceActivity引发的血案
- the apk for your currently selected variant(app-release-unsigned.apk)is not signed.
- 一场版本升级引发的性能血案 - 之数据历险
- 由值类型分配在GC堆中引发的血案
- GC与Memory pool引发的一段血案
- 一次auto_increment 引发的血案!
- 一个正则表达式引发的血案
- 2007-11-16 日志:照片,难道真要引发血案?
- 一个“Spring轮子”引发的血案(1)
- 一个“Spring轮子”引发的“血案”(4)
- 一个“Spring轮子”引发的血案(1)
- 一个“Spring轮子”引发的“血案”(6)
- cocos2d-x之__Array:: createWithContentsOfFile引发的“血案”
- 一个“Spring轮子”引发的“血案”(5)