【问题标题】:ActionScript 3: ByteArray to binary StringActionScript 3:ByteArray 到二进制字符串
【发布时间】:2011-09-12 21:33:43
【问题描述】:

有人要求我实现 MD5 哈希器 ActionScript-3,当我在调试我的输入格式时,我遇到了一个问题。当我尝试使用 .toString(2) 将 ByteArray 输出为二进制字符串时,toString(2) 方法将执行一些捷径,从而改变二进制的外观。 例如

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 位块?

【问题讨论】:

  • 要么在转换为字符串之前添加 256,然后去掉第一个数字,要么在之后手动添加适当数量的零。但是到底为什么你需要创建二进制字符串来做 MD5 呢?您知道 ActionScript 已经在 uint 上拥有完全足够的位运算符,对吧?
  • 既然您已经在编写自己的 MD5 算法,为什么不也编写自己的二进制 toString 呢?这很简单。另外,你见过this library吗?它包括一个非常快速的MD5函数。
  • 我使用二进制字符串进行调试,以确保我的输入格式正确。
  • 如果有任何答案解决了您的问题,请选择该答案作为已接受的答案。

标签: string actionscript-3 bit


【解决方案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

更新
如果您想获得完整 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

【讨论】:

    【解决方案2】:

    Here 是在Hurlant 库上扩展的函数,用于处理散列字节数组。
    这门课有一个学习曲线,但一旦你学会了,你就会爱上它。

    至于 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)
    

    【讨论】:

      猜你喜欢
      • 2012-06-16
      • 2020-03-10
      • 1970-01-01
      • 1970-01-01
      • 2016-02-26
      • 2017-08-08
      • 1970-01-01
      • 2015-11-21
      • 2012-08-27
      相关资源
      最近更新 更多