2011-09-12 67 views
0

我被要求實現MD5 hasher ActionScript-3,並且正如我在調試如何格式化我的輸入時遇到了一個問題。當我嘗試使用.toString(2)將ByteArray輸出爲二進制字符串時,toString(2)方法將執行一些捷徑,以改變二進制文件的外觀。 對於實例ActionScript 3:ByteArray轉爲二進制字符串

var bytes:ByteArray = new ByteArray(); 
bytes.endian = Endian.LITTLE_ENDIAN; 
bytes.writeUTFBytes("a"); 
bytes.writeByte(0x0); 
var t1:String = bytes[0].toString(2); // is 1100001 when it should be 01100001 
var t2:String = bytes[1].toString(2); // is 0 when it should be 00000000 

,所以我想我的問題是,可能有辦法輸出的ByteArray將始終顯示每個字節爲8位塊一個二進制字符串?

+1

要麼增加256你轉換爲字符串之前,然後去掉第一個數字,或者手動預先準備的之後適當數量的零。但爲什麼你需要創建二進制字符串來執行MD5?你知道ActionScript已經完全適合'uint'的按位運算符,對吧? –

+1

既然你已經在編寫你自己的MD5算法,爲什麼不寫你自己的二進制toString呢?這很簡單。另外,你見過[這個圖書館](http://www.blooddy.by/en/crypto/)嗎?它包含*非常*快速的MD5功能。 – Cameron

+0

我正在使用二進制字符串進行調試,以確保我已正確格式化我的輸入。 – Nimnam1

回答

1

所有你需要的是墊的toString(2)的輸出與零點遺令它的長度等於8。使用此功能填充

function padString(str:String, len:int, char:String, padLeft:Boolean = true):String{ 
    var padLength:int = len - str.length; 
    var str_padding:String = ""; 
    if(padLength > 0 && char.length == 1) 
     for(var i:int = 0; i < padLength; i++) 
      str_padding += char; 

    return (padLeft ? str_padding : "") + str + (!padLeft ? str_padding: ""); 
} 

有了此功能的代碼看起來是這樣的,如果你想獲得一個〜應變給出正確的輸出

var bytes:ByteArray = new ByteArray(); 
bytes.endian = Endian.LITTLE_ENDIAN; 
bytes.writeUTFBytes("a"); 
bytes.writeByte(0x0); 
var t1:String = padString(bytes[0].toString(2), 8, "0"); // is now 01100001 
var t2:String = padString(bytes[1].toString(2), 8, "0"); // is now 00000000 

更新
g表示完整的byteArray,你可以使用一個迭代byteArray的函數。我寫了下面的函數,它似乎正常工作。試試看

// String Padding function 
function padString(str:String, len:int, char:String, padLeft:Boolean = true):String{ 
    // get no of padding characters needed 
    var padLength:int = len - str.length; 

    // padding string 
    var str_padding:String = ""; 

    // loop from 0 to no of padding characters needed 
    // Note: this loop will not run if padLength is less than 1 
    // as i < padLength will be false from begining 
    for(var i:int = 0; i < padLength; i++) 
     str_padding += char; 

    // return string with padding attached either to left or right depending on the padLeft Boolean 
    return (padLeft ? str_padding : "") + str + (!padLeft ? str_padding: ""); 
} 

// Return a Binary String Representation of a byte Array 
function byteArrayToBinaryString(bArray:ByteArray):String{ 
    // binary string to return 
    var str:String = ""; 

    // store length so that it is not recomputed on every loop 
    var aLen = bArray.length; 

    // loop over all available bytes and concatenate the padded string to return string 
    for(var i:int = 0; i < aLen; i++) 
     str += padString(bArray[i].toString(2), 8, "0"); 

    // return binary string 
    return str; 
} 

現在,你可以簡單地使用byteArrayToBinaryString()功能是這樣的:

// init byte array and set Endianness 
var bytes:ByteArray = new ByteArray(); 
bytes.endian = Endian.LITTLE_ENDIAN; 

// write some data to byte array 
bytes.writeUTFBytes("a"); 
bytes.writeByte(0x0); 

// convert to binaryString 
var byteStr:String = byteArrayToBinaryString(bytes); // returns 0110000100000000 
-1

Here是在Hurlant庫上擴展的函數,用於處理散列byteArray。
這個班有一個學習曲線,但一旦你得到它,你會愛上它。

至於你的toString的ByteArray問題。我知道toString方法是不準確的。
你可能想看看byteArray.readMultiByte,它會給你你正在尋找的01。雖然我似乎無法得到它在我的示例代碼上工作大聲笑
我只是總是得到一個空字符串。

var bytes:ByteArray = new ByteArray(); 
bytes.endian = Endian.LITTLE_ENDIAN; 
bytes.writeUTFBytes("a"); 
bytes.writeByte(0x0); 
bytes.position = 0 
var t1:String = bytes.readMultiByte(1,'us-ascii'); // is 1100001 when it should be 01100001 
trace(t1) 
var t2:String = bytes.readMultiByte(1,'iso-8859-01'); // is 0 when it should be 00000000 
trace(t2) 
相關問題