好的,我想将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);
}
感谢名单!
答案 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