js的字节数组与数值之间的相互转换

用的是别人写的文章,这里只做记录方便使用
test();
function test() {
var bytes = getFloat64Bytes(-3.33);
alert(bytes);
alert(toFloat64(bytes));
}
//构建一个视图,把字节数组写到缓存中,索引从0开始,大端字节序
function getView(bytes) {
var view = new DataView(new ArrayBuffer(bytes.length));
for (var i = 0; i < bytes.length; i++) {
view.setUint8(i, bytes[i]);
}
return view;
}
//将字节数组转成有符号的8位整型,大端字节序
function toInt8(bytes) {
return getView(bytes).getInt8();
}
//将字节数组转成无符号的8位整型,大端字节序
function toUint8(bytes) {
return getView(bytes).getUint8();
}
//将字节数组转成有符号的16位整型,大端字节序
function toInt16(bytes) {
return getView(bytes).getInt16();
}
//将字节数组转成无符号的16位整型,大端字节序
function toUint16(bytes) {
return getView(bytes).getUint16();
}
//将字节数组转成有符号的32位整型,大端字节序
function toInt32(bytes) {
return getView(bytes).getInt32();
}
//将字节数组转成无符号的32位整型,大端字节序
function toUint32(bytes) {
return getView(bytes).getUint32();
}
//将字节数组转成32位浮点型,大端字节序
function toFloat32(bytes) {
return getView(bytes).getFloat32();
}
//将字节数组转成64位浮点型,大端字节序
function toFloat64(bytes) {
return getView(bytes).getFloat64();
}

//将数值写入到视图中,获得其字节数组,大端字节序
function getUint8Array(len, setNum) {
    var buffer = new ArrayBuffer(len);  //指定字节长度
    setNum(new DataView(buffer));  //根据不同的类型调用不同的函数来写入数值
    return new Uint8Array(buffer); //创建一个字节数组,从缓存中拿取数据
}
//得到一个8位有符号整型的字节数组,大端字节序
function getInt8Bytes(num) {
    return getUint8Array(1, function (view) { view.setInt8(0, num); })
}
//得到一个8位无符号整型的字节数组,大端字节序
function getUint8Bytes(num) {
    return getUint8Array(1, function (view) { view.setUint8(0, num); })
}
//得到一个16位有符号整型的字节数组,大端字节序
function getInt16Bytes(num) {
    return getUint8Array(2, function (view) { view.setInt16(0, num); })
}
//得到一个16位无符号整型的字节数组,大端字节序
function getUint16Bytes(num) {
    return getUint8Array(2, function (view) { view.setUint16(0, num); })
}
//得到一个32位有符号整型的字节数组,大端字节序
function getInt32Bytes(num) {
    return getUint8Array(4, function (view) { view.setInt32(0, num); })
}
//得到一个32位无符号整型的字节数组,大端字节序
function getUint32Bytes(num) {
    return getUint8Array(4, function (view) { view.setUint32(0, num); })
}
//得到一个32位浮点型的字节数组,大端字节序
function getFloat32Bytes(num) {
    return getUint8Array(4, function (view) { view.setFloat32(0, num); })
}
//得到一个64位浮点型的字节数组,大端字节序
function getFloat64Bytes(num) {
    return getUint8Array(8, function (view) { view.setFloat64(0, num); })
}

下面几个为另一种实现方式的版本,只实现了简单几种,其他的实现起来比较麻烦,所以就中途放弃了
//function toInt32(bytes) {
//    return ((bytes[0] & 0xFF) << 24) | ((bytes[1] & 0xFF) << 16) | ((bytes[2] & 0xFF) << 8) | (bytes[3] & 0xFF);
//}
//function toUInt16(bytes) {
//    return ((bytes[0] & 0xFF) << 8) | (bytes[1] & 0xFF);
//}
//function toInt16(bytes) {
//    return bytes[0] >> 7 == 0 ? toUInt16(bytes) : toUInt16(bytes) - 65536;
//}
//function getInt32Bytes(num) {
//    return [num >> 24 & 0xFF, num >> 16 & 0xFF, num >> 8 & 0xFF, num & 0xFF];
//}
//function getUint16Bytes(num) {
//    return [num >> 8 & 0xFF, num & 0xFF];
//}
//function getInt16Bytes(num) {
//    return num >= 0 ? getUint16Bytes(num) : getUint16Bytes(65536 + num);
//}

还有个小问题,我这边数字转字节数组函数的返回值都是Uint8Array,这是一个TypeArray类型,它和Array不是一个东西,定长的,不能push,而且Array.concat无法正常连接Uint8Array数组(会将Uint8Array整体作为一个对象),如果使用的是Array,就需要自己处理下,或者直接在getUint8Array函数中将Uint8Array转成Array

复制代码
//将数值写入到视图中,获得其字节数组,大端字节序
function getUint8Array(len, setNum) {
var buffer = new ArrayBuffer(len); //指定字节长度
setNum(new DataView(buffer)); //根据不同的类型调用不同的函数来写入数值
var uint8Array = new Uint8Array(buffer); //创建一个字节数组,从缓存中拿取数据
var arr = new Array(); //将Uint8Array转成Array数组,不考虑性能问题
for (var i = 0; i < uint8Array.byteLength; i++) { //尴尬,Uint8Array没有length,只有byteLength,之前写的竟然没测就发布了,现在才发现问题
arr.push(uint8Array[i]);
}
return arr;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值