HTML5 FileReader - 上传CSV文件并将其内容显示为原始二进制文件(0和1的字符串)

时间:2017-09-20 07:22:16

标签: javascript html5

我需要上传CSV文件并将其内容作为一系列0和1推送到终点。

示例:abc.csv ===> “01101000 01100101 01101100 01101100 01101111 ....”

当我尝试使用现有的FileReader.readAsBinaryString()时,console.log正在显示csv文件的文本。

例如

const reader = new FileReader();
reader.onload = evt => {
    result = evt.target.result;
    console.log(result);
};
reader.readAsBinaryString(file);

输出:以上传的csv文件的原始文本形式出现。

在此感谢任何帮助。

感谢。

1 个答案:

答案 0 :(得分:0)

您可以使用bitwise operators将字节转换为位。使用AND运算符(单个'&'),您可以检查是否设置了位。以下代码是一个示例:

var bits = [
    0x80, // 10000000
    0x40, // 01000000
    0x20, // 00100000
    0x10, // 00010000
    0x08, // 00001000
    0x04, // 00000100
    0x02, // 00000010
    0x01  // 00000001
];

// convert 'true' or 'false' to '1' or '0'
function boolToBinary(b){
    return (b) ? '1' : '0';
}

// convert a byte to a binary string
function byteToBinary(b){
    var output = '';
    for (var i = 0; i < 8; i++)
        // check if bit 'i' is set
        output += boolToBinary(b & bits[i]);

    return output;
}

// convert a string to a binary string
function strToBinary(s){
    if (!s) return '';

    var output = '';
    for (var i = 0; i < s.length; i++)
        // use charCodeAt to convert a char to a byte: ('A' => 65)
        output += byteToBinary(s.charCodeAt(i)) + ' ';

    return output.slice(0, -1);
}

console.log(strToBinary('HALLO'));

for (var i = 1; i < 256; i*=2)
    console.log(byteToBinary(i) + ' == ' + i);

控制台输出将是:

01001000 01000001 01001100 01001100 01001111
00000001 == 1
00000010 == 2
00000100 == 4
00001000 == 8
00010000 == 16
00100000 == 32
01000000 == 64
10000000 == 128

这似乎也是您的预期输出。

但是,请注意可能存在一些变化。上面的代码使用Little Endian,这意味着该字节是从右到左(例如在Windows中使用)。你也可以使用Big Endian。您应该匹配您的API。要将上面的代码转换为Big Endian,只需反转位数组(从低位开始,结束高位)。 另外,我编写了ASCII字符的代码,每个字符一个字节。 Unicode每个字符使用两个字节。对于Unicode;首先将charcode分成两个字节,如下所示:

function strToBinary(s){
    if (!s) return '';

    var output = '';
    for (var i = 0; i < s.length; i++){
        var charCode = s.charCodeAt(i);
        var charCode_lo = charCode & 0x00FF;
        var charCode_hi = (charCode & 0xFF00) >> 8;

        output += byteToBinary(charCode_hi) + ' ';
        output += byteToBinary(charCode_lo) + ' ';
    }

    return output.slice(0, -1);
}

再次,对于Big Endian,请切换输出顺序。