我必須解析下面的「一些文本< 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