针对C的语言的转换成Java语言存在如下,指针、结构体、宏、unsigned和signed等等转换的问题。在面对的这些问题的时候需要想好策略,我个人秉承C面向过程的思想实现。
在转换过程首先解决unsigned int 的转换问题,unsigned int 需要转成Java中long类型,Java中存在一个隐式转串
例如:C语言中 unsigned int utest = 0xFFFFFFFF;
Java中 int xint = 0xFFFFFFFF; long xlong = (long)(xint & 0xFFFFFFFF); 此时xlong是等于-1;
需要使用此方式转换 long xlong = (long)(xint & 0xFFFFFFFFL);
转换的核心就是宏的转换,
C语言的宏定义:
#define F(x, y, z) (((x) & (y)) | ((~x) & (z)))
#define G(x, y, z) (((x) & (z)) | ((y) & (~z)))
#define H(x, y, z) ((x) ^ (y) ^ (z))
#define I(x, y, z) ((y) ^ ((x) | (~z)))
#define ROTATE_LEFT(x, n) (((x) << (n)) | ((x) >> (32-(n))))
#define FF(a, b, c, d, x, s, ac) do{ { (a) += F ((b), (c), (d)) + (x) + (UINT4)(ac); (a) = ROTATE_LEFT ((a), (s)); (a) += (b); }}while(0)
#define GG(a, b, c, d, x, s, ac) { (a) += G ((b), (c), (d)) + (x) + (UINT4)(ac); (a) = ROTATE_LEFT ((a), (s)); (a) += (b); }
#define HH(a, b, c, d, x, s, ac) { (a) += H ((b), (c), (d)) + (x) + (UINT4)(ac); (a) = ROTATE_LEFT ((a), (s)); (a) += (b); }
#define II(a, b, c, d, x, s, ac) { (a) += I ((b), (c), (d)) + (x) + (UINT4)(ac); (a) = ROTATE_LEFT ((a), (s)); (a) += (b); }
转换成Java的方法:
long longCutFourHighBytes(long x) {
return (x & 0xFFFFFFFFL);
}
int F(long x, long y, long z) {
return (int) (((x) & (y)) | ((~x) & (z)));
}
int G(long x, long y, long z) {
return (int) (((x) & (z)) | ((y) & (~z)));
}
int H(long x, long y, long z) {
return (int) ((x) ^ (y) ^ (z));
}
int I(long x, long y, long z) {
return (int) ((y) ^ ((x) | (~z)));
}
int ROTATE_LEFT(long x, long n) {
return (int) ((((x) << (n)) & 0xFFFFFFFFL) | (((x) >> (32 - (n))) & 0xFFFFFFFFL));
}
int FF(long a, long b, long c, long d, long x, long s, long ac) {
(a) += int2Long(F(longCutFourHighBytes(b), longCutFourHighBytes(c), longCutFourHighBytes(d))) + longCutFourHighBytes(x) + longCutFourHighBytes(ac);
(a) = int2Long(ROTATE_LEFT(longCutFourHighBytes(a), longCutFourHighBytes(s)));
(a) += longCutFourHighBytes(b);
a &= 0xFFFFFFFFL;
return (int) a;
}
int GG(long a, long b, long c, long d, long x, long s, long ac) {
(a) += int2Long(G(longCutFourHighBytes(b), longCutFourHighBytes(c), longCutFourHighBytes(d))) + longCutFourHighBytes(x) + longCutFourHighBytes(ac);
(a) = int2Long(ROTATE_LEFT(longCutFourHighBytes(a), longCutFourHighBytes(s)));
(a) += longCutFourHighBytes(b);
return (int) longCutFourHighBytes(a);
}
int HH(long a, long b, long c, long d, long x, long s, long ac) {
(a) += int2Long(H(longCutFourHighBytes(b), longCutFourHighBytes(c), longCutFourHighBytes(d))) + longCutFourHighBytes(x) + longCutFourHighBytes(ac);
(a) = int2Long(ROTATE_LEFT(longCutFourHighBytes(a), longCutFourHighBytes(s)));
(a) += longCutFourHighBytes(b);
return (int) longCutFourHighBytes(a);
}
int II(long a, long b, long c, long d, long x, long s, long ac) {
(a) += int2Long(I(longCutFourHighBytes(b), longCutFourHighBytes(c), longCutFourHighBytes(d))) + longCutFourHighBytes(x) + longCutFourHighBytes(ac);
(a) = int2Long(ROTATE_LEFT(longCutFourHighBytes(a), longCutFourHighBytes(s)));
(a) += longCutFourHighBytes(b);
return (int)longCutFourHighBytes(a);
}
完整代码如下:
public class Md5 {
class MD5_CTX {
public int[] state = new int[4]; /* state (ABCD) */
public int[] count = new int[2]; /* number of bits, modulo 2^64 (lsb first) */
public byte[] buffer = new byte[64]; /* input buffer */
};
/*
* Length of test block,