ActionScript 3: ByteArray для двоичной строки - PullRequest
0 голосов
/ 13 сентября 2011

Меня попросили реализовать и MD5-хэш ActionScript-3, и, поскольку я был в процессе отладки того, как я отформатировал ввод, я столкнулся с проблемой.Когда я пытаюсь вывести ByteArray в виде двоичной строки, используя .toString (2), метод 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-битного блока?

Ответы [ 2 ]

1 голос
/ 13 сентября 2011

Все, что вам нужно, это заполнить вывод 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. Я написал следующую функцию, и она, кажется, работает правильно. Попробуйте 1010 *

// 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
0 голосов
/ 13 сентября 2011

Здесь - это функция, расширенная в библиотеке Hurlant для обработки хеширования byteArray.
У этого класса есть курс обучения, но как только вы его получите, он вам понравится.

Насколько ваша проблема ByteArray с toString. Я знаю, что метод toString не является точным по этой причине.
Возможно, вы захотите взглянуть на byteArray.readMultiByte, который даст вам 01, что вы ищете. Хотя я не могу заставить его работать с моим примером кода, LOL
Я просто всегда получаю пустую строку.

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)
...