我必须解析下面的“一些文本< 40字节哈希>”我可以在不损坏40字节哈希部分的情况下将这整个东西读入一个字符串吗?SHA-1哈希与字符串混合
事情是哈希不会在那里,所以我不想在阅读时处理它。
编辑:我忘了提及40字节散列是2x20字节散列没有编码原始字节。
我必须解析下面的“一些文本< 40字节哈希>”我可以在不损坏40字节哈希部分的情况下将这整个东西读入一个字符串吗?SHA-1哈希与字符串混合
事情是哈希不会在那里,所以我不想在阅读时处理它。
编辑:我忘了提及40字节散列是2x20字节散列没有编码原始字节。
SHA-1散列长度为20个字节(160位)。如果处理40个字符的散列,那么它们可能是散列的ASCII表示,因此只包含字符0-9和a-f。如果是这种情况,那么你应该能够毫无困难地阅读和操纵Java中的字符串。
编辑提到40字节散列是2,20字节sha-1散列没有编码。 – 2009-06-30 00:43:25
一些更多的细节可能是有用的,但我认为答案是你应该没问题。
您没有说过SHA-1散列是如何编码的(常见的可能性包括“none”(原始字节),Base64和十六进制)。由于SHA-1产生一个20字节(160位)散列,我猜测它将使用十六进制编码,因为这会使你提到的40个字节所需的空间增加一倍。使用该编码,将使用2个字符对散列中的每个字节进行编码,使用符号0到9和A到F.这些都是ASCII字符,因此您很安全。
由于Base64中使用的每个字符都是ASCII,因此Base64编码也可以工作(虽然可能不是您询问的问题,因为它将字号增加了大约1/3,使得您的字节数少于40字节)。
如果直接使用原始字节,则会出现问题,因为某些值不是有效的字符。
OK,现在你已经澄清,这些都是原始字节
不,你不能读成Java这是一个字符串,你需要将它读成原始字节。
工作代码: 将字节串输入转换为十六进制字符,在几乎所有字符串编码中都应该是安全的。使用我在其他问题中发布的代码将十六进制字符解码回原始字节。
/** Lookup table: character for a half-byte */
static final char[] CHAR_FOR_BYTE = {'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};
/** Encode byte data as a hex string... hex chars are UPPERCASE */
public static String encode(byte[] data){
if(data == null || data.length==0){
return null;
}
char[] store = new char[data.length*2];
for(int i=0; i<data.length; i++){
final int val = (data[i]&0xFF);
final int charLoc=i<<1;
store[charLoc]=CHAR_FOR_BYTE[val>>>4];
store[charLoc+1]=CHAR_FOR_BYTE[val&0x0F];
}
return new String(store);
}
从输入流作为一个字节流中读取它,然后剥离串出流是这样的:
String s = new String(Arrays.copyOfRange(bytes, 0, bytes.length-40));
然后让你的字节数为:
byte[] hash = Arrays.copyOfRange(bytes, s.length-1, bytes.length-1)
什么你最终与吗? – codethulhu 2009-07-20 17:12:15