问题
参考编写了一份C++计算MD5值的代码,发现在Windows环境下计算出的MD5值内容是正确的,但同样代码在Linux环境下得到的结果却截然不同。。。
原因
踩了数据模型不同的大坑。。。
32位环境涉及"ILP32"数据模型,是因为C数据类型为32位的int、long、指针。而64位环境使用不同的数据模型,此时的long和指针已为64位,故称作"LP64"数据模型。
现今所有64位的类Unix平台均使用LP64
数据模型,而64位Windows使用LLP64
数据模型,除了指针是64位,其他基本类型都没有变。
TYPE | LP32 | ILP32 | LP64 | ILP64 | LLP64 |
---|---|---|---|---|---|
CHAR | 8 | 8 | 8 | 8 | 8 |
SHORT | 16 | 16 | 16 | 16 | 16 |
INT | 16 | 32 | 32 | 64 | 32 |
LONG | 32 | 32 | 64 | 64 | 32 |
LONGLONG | 64 | 64 | 64 | 64 | 64 |
POINTER | 32 | 32 | 64 | 64 | 64 |
其中LP64
,ILP64
,LLP64
是64位平台上的字长模型,ILP32
和LP32
是32位平台上的字长模型。
解决方法
在Windows平台下,long
类型占四个字节,以下代码正确:
// UINT4 defines a four byte word
typedef unsigned long int UINT4;
在Linux平台下,long
类型占八个字节,正确代码应为:
// UINT4 defines a four byte word
typedef uint32_t UINT4;