浮点数转换为字节(JavaScript)

3

该函数传输的是双精度浮点数。

function writebyte(id, data)
{
    data = Math.floor(data);
    buf[id] = String.fromCharCode(data & (255));
}

对于0-127的值,它可以正常工作。但是对于负数或大于127的值,它会出现错误。

128 = 0xC2 0x80 (should be 0x80 1 byte)
-1  = 0xC3 0xBF (should be 0xFF 1 byte)

我认为问题出在使用 String.fromCharCode 函数时,参数是128++或负数。是否有直接将字节写入数组而不使用 String.fromCharCode 的方法?

2
看起来你想要用8位表示大于+127的数字,但同时使用补码二进制表示负数,其中最高位作为-128。你不能两者兼得... - El Ronnoco
我不明白。为什么我不能两者兼顾?-1 == 255 == 0xFF,-2 == 254 == 0xFE。buf是通过websocket协议发送的,我只想要如果我向这个函数传输-1或255,第一个字节将是0xFF(例如)。 - Demion
128 == 0x80。没有-128(最大有符号数是-127)。 - Demion
1
传统上,最高有效位被设置为负数(即-128),为有符号位提供了-128至127的范围。我不确定您是否使用不同的系统? - El Ronnoco
你说得对,有符号范围是从-128到127。无符号范围是从0到255。但这并没有解决我的问题。我想在函数中传输-1,在数据[id]中应该是0xFF,或者我传输255,在数据[id]中应该是0xFF,以此类推。 - Demion
让我们在聊天中继续这个讨论:http://chat.stackoverflow.com/rooms/5620/discussion-between-demion-and-el-ronnoco - Demion
1个回答

1
这个答案中,您将找到JavaScript代码,可以将(十六进制)字节转换为双精度浮点数。[JS没有“浮点数”]
将过程反转留给读者作为练习...

在JS中,字节操作将双精度浮点数转换为中间整数表示形式。它们不会对实际的浮点数表示进行操作。 - hugomg
@missingno 你没有理解重点 - 通过操作原始浮点数,可以计算出符号、尾数和指数,并从中推导出正确的IEE754表示。我之前发布的代码是反过来做的。 - Alnitak
Math.floor不会将float转换为整数吗? - Demion
@Demion 不是真的,它只是删除了小数部分。无论如何,你能否澄清一下你的问题——现在看起来你只是在谈论“小整数”值,而不是“双精度浮点数”! - Alnitak
是的,我只使用-128..127或0..255。但另一个(不是我的)代码将double传输到此函数。 - Demion
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接