http://www.iecn.net/bbs/view/100141.html

解决方案 »

  1.   

    str.length()不是字节数,而是字符数。
      

  2.   

    这是md5中的补位并形成n个512位的数组项数组的方法,可我怎么也理解不了第一句条件是,让传进来的str满足N*512+448位,即N*64+56字节,即(N+1)*64-8字节。不足的位先补一个1然后补n个0。java中一个字符是两个字节,那么一个str的字节长度就是两倍的strlen
    于是我怎么也理解不了这句:
    int nblk = ((str.length() + 8) >> 6) + 1;
    怎么不是
    int nblk = ((str.length() + 4) >> 5) + 1;
    呢?
    大家帮帮忙吧~下面是这个方法的源码。
      

  3.   

    private int[] str2blks_MD5(String str) {
    int nblk = ((str.length() + 8) >> 6) + 1;
    int[] blks = new int[nblk * 16];
    int i = 0;
    for (i = 0; i < nblk * 16; i++) {
    blks[i] = 0;
    }
    for (i = 0; i < str.length(); i++) {
    blks[i >> 2] |= str.charAt(i) << ((i % 4) * 8);
    }
    blks[i >> 2] |= 0x80 << ((i % 4) * 8);
    blks[nblk * 16 - 2] = str.length() * 8; return blks;
    }
      

  4.   

    我想你的问题在这“java中一个字符是两个字节,那么一个str的字节长度就是两倍的strlen”
    String s ="123"; s.length()是3  
    String s = "我"; s.length()是1
      

  5.   

    正因为是字符数而不是字节数,同时我也知道是unicode
    我才觉得那句怪异