【问题标题】:JavaScript simple BitConverterJavaScript 简单的 BitConverter
【发布时间】:2018-04-21 00:41:01
【问题描述】:

我需要为 JavaScript 制作简单的 C# BitConverter。我做了简单的 BitConverter

class BitConverter{
constructor(){}
GetBytes(int){
    var b = new Buffer(8)
    b[0] = int;
    b[1] = int >> 8
    b[2] = int >> 16
    b[3] = int >> 24
    return b
}
ToInt(buffer){
    return buffer[0] | buffer[1]<<8 | buffer[2] << 16 | buffer[3] << 24 
}
}

GetBytes 给我的输出与 c# 相同,但 toInt 不是这样...... toInt 不要把我放入 GetBytes 的内容还给我(更大的数字) 示例:

var a = new BitConverter()
var e = 285128170;
var c =a.GetBytes(e);
var v = a.ToInt(c);
console.log(e) // 2851281703
console.log(c) // <Buffer 27 1b f3 a9 00 00 00 00>
console.log(v) //-1443685593

【问题讨论】:

  • 嗯。在节点中尝试了这个,它似乎对我来说很好。你能举例说明你输入的数字和返回的数字吗?
  • data : GetBytes(2851281703) // ToInt(a) // -1443685593

标签: javascript node.js bitconverter


【解决方案1】:

Javascript 将您的最终结果视为带符号的数字。您可以通过使用&gt;&gt;&gt; 0 结束按位运算来解决此问题,这将强制符号位为 0。因此,对于您的示例:

class BitConverter{
    GetBytes(int) {
        var b = new Buffer(8)
        b[0] = int;
        b[1] = int >> 8
        b[2] = int >> 16
        b[3] = int >> 24
        return b
    }
    ToInt(buffer) {
        return (buffer[0] | buffer[1]<<8 | buffer[2] << 16 | buffer[3] << 24) >>> 0;
    }
}

var converter = new BitConverter();
converter.ToInt(converter.GetBytes(2851281703)) // Returns 2851281703

来自documentation of zero-fill right shift

此运算符将第一个操作数移动指定的位数 正确的。右移的多余位被丢弃。零 位从左侧移入。 符号位变为 0,所以 结果总是非负数。

强调我的。

【讨论】:

  • 你成就了我的一天!如何更好地编写 GetBytes?我必须这样做吗?
猜你喜欢
  • 2017-06-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-12
  • 2011-11-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多