【问题标题】:can ISO-8859-1 encode MD5 bytes correctly ?ISO-8859-1 可以正确编码 MD5 字节吗?
【发布时间】:2015-01-12 03:13:38
【问题描述】:

1.String中有一些数据:

String data = "some......";

2.并使用MD5将其转换为字节:

byte [] result = MD5.toMD5(data);

3.现在我把它编码成字符串:

String encodeString = new String(result,"ISO-8895-1");

4.然后将其解码为字节:

byte [] decodeBytes = encodeString.getBytes("ISO-8859-1");

我的问题是:decodeBytes 是否等于result

我的困惑是result中是否会有Zero,它会导致Step3中的截断吗?

如果让decodeBytes等于result有什么问题,如果我在Step1中限制String的数据类型比如只允许Letters and Numbers,会不会是问题避免?

【问题讨论】:

  • Java 字符串不是以空值结尾的,因此零字节没有问题。并非所有字符编码都可以往返,这可能是个问题,但我不确定这种特定的编码。 (请注意,您可能希望将哈希显示为十六进制,而不是直接转换其字节。)
  • @JeffreyBosboom 我知道十六进制字符串,但现在我面临着一些图书馆的奇怪用法。
  • 您可能无法检索原始哈希,不。您将需要更改第 3 步。
  • @LouisWasserman 我在第 128 行的osxr.org/android/source/libcore/luni/src/main/native/… 中找到了本机函数。似乎 ISO-8859-1 没有进行真正的编码,所以我认为使用是安全的,对吗?
  • 'Some library' 比如什么? “奇怪的用法”比如什么?它真的希望以String 的形式接收MD5 吗?

标签: java md5 decode encode


【解决方案1】:

如果 ISO-8859-1 是 8 位字符代码,则没有理由不将字节值解码为字符。尽管不包括 65 个代码点(用于控制字符),但 String 方法处理这些代码点时,就像 ISO/IEC 6429 中定义的控制是该字符集的一部分一样。

往返跳闸字节值 0 到 255 可以完美运行,也可以使用 byte[]。

byte[] bs = new byte[256];
String encode() throws Exception {
    return new String( bs, "ISO-8859-1" );
}
byte[] decode( String s ) throws Exception{
    return s.getBytes( "ISO-8859-1" );
}
 void set(){
    for( int i = 0; i < bs.length; ++i ){
        bs[i] = (byte)i;
    }
}
boolean cmp( byte[] x ){
    for( int i = 0; i < bs.length; ++i ){
        if( bs[i] != x[i] ){
            System.out.println( i + ": " + bs[i] + " != " + x[i] );
            return false;
         }
    }
    return true;
}
void round() throws Exception{
    String s = encode();
    if( s.length() != 256 ) throw new IllegalStateException();
        byte[] res = decode( s );
        if( ! cmp( res ) ) System.out.println( "false" );
    }
}

【讨论】:

  • 原谅我英语不好,我的理解是 byte[] 可以在 ISO-8859-1 中往返,对吗?
  • 是的,我实际上进行了往返。请参阅添加的代码。 - UTF-8 肯定行不通。
  • 非常感谢!救我几天!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-12-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-12
  • 1970-01-01
相关资源
最近更新 更多