将C语言实现MD5算法转换成Java的代码

针对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, 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

xuhuancater

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值