我正在使用WebGL渲染二进制编码的网格文件.二进制文件以big-endian格式写出(我可以通过在十六进制编辑器中打开文件或使用fiddler查看网络流量来验证这一点).当我尝试使用Float32Array或Int32Array读取二进制响应时,二进制文件被解释为little-endian并且我的值是错误的:
// Interpret first 32bits in buffer as an int
var wrongValue = new Int32Array(binaryArrayBuffer)[0];
Run Code Online (Sandbox Code Playgroud)
我在http://www.khronos.org/registry/typedarray/specs/latest/找不到任何类型数组默认字节序的引用,所以我想知道这笔交易是什么?在使用类型化数组进行读取时,我是否应该假设所有二进制数据都应该是小端?
为了解决这个问题,我可以使用DataView对象(在上一个链接中讨论)并调用:
// Interpret first 32bits in buffer as an int
var correctValue = new DataView(binaryArrayBuffer).getInt32(0);
Run Code Online (Sandbox Code Playgroud)
默认情况下,"getInt32"等DataView函数会读取big-endian值.
(注意:我已经使用Google Chrome 15和Firefox 8进行了测试,它们的行为方式相同)
我很确定它只是一些按位操作的问题,我只是不完全确定我应该做什么,并且所有搜索都返回"64位对32位".
我试图在任何其他语言中执行一些简单易懂的东西,但不是javascript:从浮动中获取位数(反之亦然).
在C/C++中它会是这样的
float a = 3.1415; int b = *((int*)&a);
反之亦然
int a = 1000; float b = *((float*)&a);
在C#中,您可以使用BitConverter ... floatBits或类似的东西......即使在VB6中为了基督的缘故,您也可以将float32存入int32.我怎么能在javascript中转换和int和浮点数?
我想将64位整数分成两个32位整数:
var bigInt = 0xffffff;
var highInt = bigInt >> 8 // get the high bits 0xfff
var lowInt = bigInt // cut of the first part (with &)?
console.log(highInt); // 0xfff
console.log(lowInt); // 0xfff
// set them together again
var reBigInt = (highInt << 8) + lowInt;
Run Code Online (Sandbox Code Playgroud)
不幸的是,既没有获得highInt也没有获得lowInt的工作......有人能给我答案我需要如何使用按位运算符吗?
问候
似乎即使是最新的Ecmascript 8也不支持64位整数.
目前我们必须使用库,如Long或UInt64或Closure Library.
在技术上是否可以在Javascript中为64位整数添加本机支持?
javascript ×4
arraybuffer ×1
byte ×1
c++ ×1
endianness ×1
integer ×1
typed-arrays ×1
types ×1
webgl ×1