将 JavaScript ArrayBuffer 中的 .NET 十进制格式 (System.Decimal) 转换为 JavaScript 中的 JavaScript 数字
Converting a .NET Decimal format (System.Decimal) in a JavaScript ArrayBuffer to a JavaScript Number in JavaScript
在 Web 浏览器中,我们通过 WebSocket 从包含 128 位 .NET 十进制类型的 C# 服务器接收 ArrayBuffers 中的二进制结构。
我们需要将其转换为原生 JavaScript 数字。
我们如何在 JavaScript 中做到这一点?
function DotNetDecimalToNumber(inputArrayBuffer, isLittleEndian = true){
let dataview = new DataView(inputArrayBuffer);
let scale = dataview.getUint8(2);
let sign = dataview.getUint8(3);
let hi32 = dataview.getUint32(4, isLittleEndian);
let low64 = dataview.getBigUint64(8, isLittleEndian);
let divisor = 1.0;
while (scale-- > 0){
divisor *= 10;
}
if (sign > 0){
divisor *= -1;
}
let highPart = 0.0;
if (hi32 > 0){
highPart = hi32 / divisor;
highPart *= 4294967296.0;
highPart *= 4294967296.0;
} else {
highPart = 0.0;
}
return (Number(low64) / divisor) + highPart;
}
//Clamped number array equivalent of byte output from C# struct for Decimal -720819.587673906
let testNumber = [0, 0, 9, 128, 0, 0, 0, 0, 50, 111, 120, 227, 148, 143, 2, 0];
//Generates a Uint8Array and uses underlying ArrayBuffer, for this example
console.log(DotNetDecimalToNumber(new Uint8Array(testNumber).buffer, true));
//outputs -720819.587673906
这在我的机器上每毫秒转换大约 1000 个小数。
在 Web 浏览器中,我们通过 WebSocket 从包含 128 位 .NET 十进制类型的 C# 服务器接收 ArrayBuffers 中的二进制结构。
我们需要将其转换为原生 JavaScript 数字。
我们如何在 JavaScript 中做到这一点?
function DotNetDecimalToNumber(inputArrayBuffer, isLittleEndian = true){
let dataview = new DataView(inputArrayBuffer);
let scale = dataview.getUint8(2);
let sign = dataview.getUint8(3);
let hi32 = dataview.getUint32(4, isLittleEndian);
let low64 = dataview.getBigUint64(8, isLittleEndian);
let divisor = 1.0;
while (scale-- > 0){
divisor *= 10;
}
if (sign > 0){
divisor *= -1;
}
let highPart = 0.0;
if (hi32 > 0){
highPart = hi32 / divisor;
highPart *= 4294967296.0;
highPart *= 4294967296.0;
} else {
highPart = 0.0;
}
return (Number(low64) / divisor) + highPart;
}
//Clamped number array equivalent of byte output from C# struct for Decimal -720819.587673906
let testNumber = [0, 0, 9, 128, 0, 0, 0, 0, 50, 111, 120, 227, 148, 143, 2, 0];
//Generates a Uint8Array and uses underlying ArrayBuffer, for this example
console.log(DotNetDecimalToNumber(new Uint8Array(testNumber).buffer, true));
//outputs -720819.587673906
这在我的机器上每毫秒转换大约 1000 个小数。