在javascript中将浮点数转换为字符串

时间:2012-10-16 15:33:08

标签: javascript byte three.js chars

好的,我想将THREE.Vector3数组有效地保存到本地存储。由于javascript使用字符串,我想使用最有效的比特率将32位浮点数转换为字符串。即理想情况下32位浮点数= 4 * 8位,这在C ++中很容易实现

问题似乎是第一个Javascript字符串是UTF,其中包括一些填充

http://en.wikipedia.org/wiki/UTF-8

其次我正在使用的代码0被转换''然后被省略,使得转换后的字节长度不可靠。

String.fromCharCode(0)==''

var float2str = function(num)
{
    var bytestream = new Array();
    var view = new DataView(new ArrayBuffer(4));
    view.setFloat32(0,num);

    bytestream.push(view.getUint8(0));
    bytestream.push(view.getUint8(1));
    bytestream.push(view.getUint8(2));
    bytestream.push(view.getUint8(3));
    return String.fromCharCode(view.getUint8(0),view.getUint8(1),view.getUint8(2),view.getUint8(3))

}

var str2float = function(str)
{

    var bytestream = unpack(str)
    var view = new DataView(new ArrayBuffer(4));
    view.setUint8(0,bytestream[0]);
    view.setUint8(1,bytestream[1]);
    view.setUint8(2,bytestream[2]);
    view.setUint8(3,bytestream[3]);
    return view.getFloat32(0);
}

感谢名单!

2 个答案:

答案 0 :(得分:1)

技巧是获取无符号8位整数的字符串值是可打印的。我发现,如果你的8位数字太小或太大(超出“面包和黄油”范围的ASCII值),你最终会得到一些不可打印的东西。因此,不是使用float中字节的四个ASCII值创建长度为4的字符串,而是使用来自float的4位值的长度为8的字符串,并将这些值偏移到可打印范围(+32)。这是我的解决方案:

var offset = 33;

var float2str = function(num){
    var view = new DataView(new ArrayBuffer(4));
    view.setFloat32(0,num);

    var fourbits = [];
    for ( var i = 0; i < 4; i++ ){
        // split each byte into two 4-bit values
        fourbits.push(view.getUint8(0) >> 4);
        fourbits.push(view.getUint8(0) & 15);
    }

    for ( var i = 0; i < 8; i++ ){
        // build a string with offset four-bit values
        fourbits[i] = String.fromCharCode(offset+fourbits[i]);
    }
    return fourbits.join('');

};

var str2float = function(str){
    var bytestream = str;
    var view = new DataView(new ArrayBuffer(4));

    for(var i = 0; i < 4; i++){
        // re-convert the characters into bytes.
        view.setUint8(i, ((bytestream[i*2].charCodeAt() - offset) << 4) + bytestream[i*2+1].charCodeAt() - offset);
    }

    return view.getFloat32(0);
};

console.log(float2str('2.251')); // "%!\"!\"!'#"
console.log(str2float(float2str('2.251'))); // 2.250999927520752

我希望这会有所帮助。

答案 1 :(得分:0)

使用base64编码。它会一次将6位转换为可打印的ASCII字符(在UTF-8中将是相同的)。因此,对于一个浮点数,实际上需要5.33个字节(该分数是可用的,即只要您将整个数组编码而不是单独的浮点数,它就不是6个字节),但这仍然可以节省一些空间。 / p>

这是一个直接从ArrayBuffer转换为base64字符串的函数(不是我的函数):https://gist.github.com/958841