如何正确地将这个块 CRC32 从 Go 翻译为 JavaScript?

2024年 2月 14日 38.1k 0

如何正确地将这个块 crc32 从 go 翻译为 javascript?

在跨语言开发过程中,我们经常会遇到需要将一个算法或函数从一种语言翻译到另一种语言的情况。在这个过程中,块 CRC32 的翻译就是一个常见的需求。但是,将这个块 CRC32 从 Go 翻译为 JavaScript 并不是一件容易的事情。在这篇文章中,php小编西瓜将向大家介绍如何正确地将这个块 CRC32 从 Go 翻译为 JavaScript,帮助开发者们解决这个问题。

问题内容

我在 go 中有这个函数:

package main

import (
"fmt"
"github.com/snksoft/crc"
)

var crctable *crc.table

func init() {
params := crc.crc32
params.finalxor = 0
params.reflectout = false
crctable = crc.newtable(params)
}

func crccalculateblock(data []byte) uint32 {

if len(data)%4 > 0 {
panic("block size needs to be a multiple of 4")
}

h := crc.newhashwithtable(crctable)

var buf [4]byte
for i := 0; i 登录后复制

结果是:0x948b389d

我正在尝试将其翻译为 javascript,但我遗漏了一些内容:

var makeCRCTable = function(){
var c;
var crcTable = [];
for(var n =0; n >> 1)) : (c >>> 1));
}
crcTable[n] = c;
}
return crcTable;
}

var crc32 = function(u8array) {
var crcTable = window.crcTable || (window.crcTable = makeCRCTable());
var crc = 0 ^ (-1);

for (var i = 0; i >> 8) ^ crcTable[(crc ^ u8array[i+3]) & 0xFF];
crc = (crc >>> 8) ^ crcTable[(crc ^ u8array[i+2]) & 0xFF];
crc = (crc >>> 8) ^ crcTable[(crc ^ u8array[i+1]) & 0xFF];
crc = (crc >>> 8) ^ crcTable[(crc ^ u8array[i]) & 0xFF];
}

return (crc ^ (-1)) >>> 0;
};

console.log(crc32(Uint8Array.from([1,2,3,4,5,6,7,8])).toString(16))

登录后复制

但结果不同。 (46e32ed6)

即使没有最终的异或我得到 b91cd129

谁能向我解释如何纠正这个问题以及为什么这是错误的?

解决方法

有两个区别:

  • go 实现已调用 reflect (请参阅 https://www.php.cn/link/f23775b54b9e62e2d15498c3b9418630):

    if t.crcparams.reflectout != t.crcparams.reflectin {
    ret = reflect(ret, t.crcparams.width)
    }

    登录后复制

  • go 中的 finalxor0 (params.finalxor = 0) 而在 js 中是 -1 (return (crc ^ (-1)) phpcngt phpcn>> 0;phpcnendc phpcn)

  • 这是生成相同哈希值的更新后的 js 实现。

    var makeCRCTable = function () {
    var c;
    var crcTable = [];
    for (var n = 0; n >> 1) : c >>> 1;
    }
    crcTable[n] = c;
    }
    return crcTable;
    };

    var crc32 = function (u8array) {
    var crcTable = window.crcTable || (window.crcTable = makeCRCTable());
    var crc = 0 ^ -1;

    for (var i = 0; i >> 8) ^ crcTable[(crc ^ u8array[i + 3]) & 0xff];
    crc = (crc >>> 8) ^ crcTable[(crc ^ u8array[i + 2]) & 0xff];
    crc = (crc >>> 8) ^ crcTable[(crc ^ u8array[i + 1]) & 0xff];
    crc = (crc >>> 8) ^ crcTable[(crc ^ u8array[i]) & 0xff];
    }

    crc = reverseBits(crc, 32);

    return (crc ^ 0) >>> 0;
    };

    function reverseBits(integer, bitLength) {
    if (bitLength > 32) {
    throw Error(
    'Bit manipulation is limited to > i) & 1) >> 0; // >>> 0 makes it unsigned even if bit 32 (the sign bit) was set
    }

    console.log(crc32(Uint8Array.from([1, 2, 3, 4, 5, 6, 7, 8])).toString(16));

    登录后复制

    以上就是如何正确地将这个块 CRC32 从 Go 翻译为 JavaScript?的详细内容,更多请关注每日运维网(www.mryunwei.com)其它相关文章!

    智能AI问答
    每日运维网(www.mryunwei.com)智能助手能迅速回答你的编程问题,提供实时的代码和解决方案,帮助你解决各种难题。不仅如此,它还能提供编程资源和学习指导,帮助你快速提升编程技能。无论你是初学者还是专业人士,AI智能助手都能成为你的可靠助手,助力你在编程领域取得更大的成就。

    我要提问

    相关标签:

    php JavaScript JS github 算法 https

    来源:stackoverflow网


    收藏


    点赞

    上一篇:需要验证 go-playground/validator/v10 中的两个字段

    下一篇:Go 中是否有一个标准类型可以进行“精确除法”?


    本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

    作者最新文章

    • Win11 彩蛋:下次 Moment 更新有望明年 2 月 24 日发布

      2024-02-13 21:21:16

    • 如何将文件从AWS S3存储桶复制到Azure Blob存储

      2024-02-13 21:18:08

    • win11系统每次打开应用时都要弹出是否允许运行的关闭步骤

      2024-02-13 21:15:20

    • AMD 锐龙 R7 8700G APU 首次实现“开盖”,液金散热可使温度降低 25℃

      2024-02-13 21:09:32

    • CentOS安装PHPStudy及CentOS安装网卡驱动

      2024-02-13 20:57:08

    • 升级mac10?

      2024-02-13 20:50:31

    • CorelDRAW贝塞尔工具怎么用 使用方法教程

      2024-02-13 20:50:09

    • 苹果手机主板短路维修店人说要230修好贵不贵?

      2024-02-13 20:48:37

    • 微软原版Win11下载_最新微软原版Win11 23H2 专业版下载镜像

      2024-02-13 20:48:19

    • 如何将接口转换为它实现的另一个接口?

      2024-02-13 20:45:08

    最新问题

    PHP函数输出结果显示为Array,而非预期的值
    我有一个php脚本,我需要将日期格式从CYYMMDD更新为MM/DD/YYYY,我写了一个函数来帮我做这个,但是当我打印它时,结果显示为'Array'。//将日期格式从CYYMMD...

    P粉722409996来自于2024-02-04 11:38:12

    0
    1
    443

    为什么我无法将 const 变量传输到不同的 React 文件
    所以我试图将const变量从一个文件传输到另一个文件。由于某种原因,我无法访问它,并且它不允许我在文本文件中显示它。下面分别是homepage.js代码和pay.js文件。我正在尝...

    P粉593118425来自于2024-02-04 11:46:16

    0
    1
    346

    MySQL:无法更新存储函数/触发器中的表“订单”,因为它已被调用此存储函数/触发器的语句使用
    我在MySQL数据库中有一个名为orders的表。在我们收到资金之前,payment_date属性为Null,此时它会更新为日期。一旦更新了payment_date属性,order...

    P粉282627613来自于2024-02-04 11:46:04

    0
    1
    298

    寻求 MySQL 查询帮助 - 计算分组范围内的时间戳计数
    有人会认为这很简单,但一整晚都在拼命努力。我有一个传感器警报日志,想要生成一个表格,其中包含每个不同传感器24小时、168小时(1周)和336小时(2周)内的事件的简单计数。我对M...

    P粉026665919来自于2024-02-04 11:20:54

    0
    1
    355

    当用户提交图像时,是否可以动态更新图像“图库”?
    我正在创建一个网站,展示我祖父的所有照片。由于我没有所有照片,而且还会有其他人来来去去,我认为有一个网站让他们可以提交照片然后查看它们的“数据库”会很不错。目前,我有一个Infin...

    P粉715228019来自于2024-02-04 11:28:23

    0
    1
    310

    Buttons 标签对于 Jquery Attr 的工作至关重要
    atrr函数没有给出所需的响应,我有一个小代码,可以从外部API中获取数据,该API在dict中有几个数据。


    • php文件怎么打开

    • php怎么取出数组的前几个元素

    • php反序列化失败怎么办

    • php怎么连接mssql数据库

    • php连接mssql数据库的方法

    • html怎么上传

    • PHP出现乱码怎么解决

    • php怎么在浏览器运行

    相关文章

    JavaScript2024新功能:Object.groupBy、正则表达式v标志
    PHP trim 函数对多字节字符的使用和限制
    新函数 json_validate() 、randomizer 类扩展…20 个PHP 8.3 新特性全面解析
    使用HTMX为WordPress增效:如何在不使用复杂框架的情况下增强平台功能
    为React 19做准备:WordPress 6.6用户指南
    如何删除WordPress中的所有评论

    发布评论