Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/85.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 用JS实现CRC8校验和_Javascript_Bluetooth Lowenergy_Checksum - Fatal编程技术网

Javascript 用JS实现CRC8校验和

Javascript 用JS实现CRC8校验和,javascript,bluetooth-lowenergy,checksum,Javascript,Bluetooth Lowenergy,Checksum,已经尝试过CRC8,但我无法获得正确的校验和 有人知道如何使用JS生成校验和吗?JavaScript中的校验和计算 在一种默认情况下数字是双浮点数的语言中,进行整数位数学可能非常困难。代码必须确保数字保持整数,甚至可能保持无符号,并且在特定的位范围内(16位、32位)。这些额外的步骤可能会使事情复杂化 诡计 要确保一个数字是一个x位整数,有几个技巧是使用AND运算符和一个允许该范围内所有位的位掩码。e、 g.确保16位数字可以通过数字&=0xffff;完成;。此外,我使用诸如num | 0或nu

已经尝试过CRC8,但我无法获得正确的校验和


有人知道如何使用JS生成校验和吗?

JavaScript中的校验和计算 在一种默认情况下数字是双浮点数的语言中,进行整数位数学可能非常困难。代码必须确保数字保持整数,甚至可能保持无符号,并且在特定的位范围内(16位、32位)。这些额外的步骤可能会使事情复杂化

诡计 要确保一个数字是一个x位整数,有几个技巧是使用AND运算符和一个允许该范围内所有位的位掩码。e、 g.确保16位数字可以通过数字&=0xffff;完成;。此外,我使用诸如num | 0或num>>>0之类的操作来确保它是32位整数、有符号或无符号。这是防止生成负结果所必需的,当您以十六进制显示校验和时,这看起来特别奇怪

速度 显然,我并不是为了制作一个快速校验和引擎,我只是想在我的SmallPRNG和ISAAC CPRNG笔(post pending;)之后更多地测试按位计算的可能性。这些算法在所有浏览器和浏览器版本中的性能都会有所不同,在某些情况下甚至可能非常慢。我相信Chrome可以非常快速地处理数据,并且可以以合理的速度计算校验和

基类 我将实现多个校验和算法,因此我将创建一个基类,它将为所选算法构造一个状态(ctx)。此状态将跟踪校验和以及算法类的实例。该类还将正确处理字符串,并将其编码考虑在内

此类还包含对Uint8Array支持的测试。我不确定这是否是测试支持的最佳方法,但它确实起到了作用

var hasTyped = (function() {
    if(!('Uint8Array' in window)) {
        return false;
    }

    try {
        var a = new window.Uint8Array(10);
        a[0] = 100;
        if(a[0] === 100) {
            return true;
        }
        return false;
    } catch (e) {
        return false;
    }
}());
算法类 现在我们可以添加带有Checksum.registerChecksum的算法。每个算法类都应该实现一个单独的和一个数组方法来处理数据,还可以实现一个setup方法,在构造校验和对象时调用该方法

BSD16 这是一个非常简单的算法,这个算法只需要一点点代码。BSD校验和算法

(function() {
    'use strict';

    if(typeof(window.Checksum) === "undefined") {
        throw "The Checksum class is required for this code.";
    }

    /**
     * Initialize anything you want in the constructor, such as setting up a lookup
     * table of bytes. Make sure to cache your calculations, so they only have to be
     * done once.
     */
    var BSD16 = function BSD16() {
        this.init = 0;
    };

    /**
     * bsd16 for arrays, each value must be numeric and will be bound to 8-bits (Int8Array or Uint8Array works best!)
     * @param   {Array}  a input (8-bit array)
     * @param   {Number} p previous checksum state
     * @returns {Number} new checksum state
     */
    BSD16.prototype.array = function(a, p) {
        var c = p || 0, i = 0, l = a.length;
        for(; i < l; i++) c = (((((c >>> 1) + ((c & 1) << 15)) | 0) + (a[i] & 0xff)) & 0xffff) | 0;
        return c;
    };

    /**
     * bsd16 for a single value, update a checksum with a new byte
     * @param   {Number} b byte (0-255)
     * @param   {Number} p previous checksum state
     * @returns {Number} new checksum state
     */
    BSD16.prototype.single = function(b, p) {
        var c = p || 0;
        return (((((c >>> 1) + ((c & 1) << 15)) | 0) + (b & 0xff)) & 0xffff) | 0;
    };

    Checksum.registerChecksum("bsd16", BSD16);
}());
(函数(){
"严格使用",;
if(类型(窗口校验和)=“未定义”){
抛出“此代码需要校验和类。”;
}
/**
*初始化构造函数中需要的任何内容,例如设置查找
*字节表。请确保缓存您的计算,这样它们只需
*做过一次。
*/
var BSD16=函数BSD16(){
this.init=0;
};
/**
*bsd16对于数组,每个值都必须是数字,并将绑定到8位(Int8Array或Uint8Array效果最好!)
*@param{Array}a输入(8位数组)
*@param{Number}p以前的校验和状态
*@返回{Number}新校验和状态
*/
BSD16.prototype.array=函数(a,p){
var c=p | | 0,i=0,l=a.长度;
对于(;i>>1)+((c&1)>>1)+((c&1)0;
};
FNV32.prototype.single=函数(b,p){
var fnv=p | | this.init;
收益率((fnv+)((fnv>0;
};
校验和寄存器校验(“fnv32”,fnv32);
}());
您可以使用此url阅读全文


这被证明是一个非常棘手的问题,但我想我有一个解决方案。它是Java的一个JavaScript端口(大部分)。我对代码做了一些简化,以消除那些似乎不影响答案的东西

首先,我必须在您的Java程序中导出与
CRC8_数据
等价的十六进制。我仅使用我找到的一个简单的
bytesToHex
例程实现了这一点(这部分是Java的):

System.out.print(bytesToHex(CRC8_数据));
...
私有静态final char[]HEX_ARRAY=“0123456789ABCDEF”.toCharArray();
公共静态字符串bytesToHex(字节[]字节){
char[]hexChars=新字符[bytes.length*2];
对于(int j=0;j>>4];
hexChars[j*2+1]=十六进制数组[v&0x0F];
}
返回新字符串(hexChars);
}
一旦我有了这个表,我就将Java代码转换成JavaScript,从而得出以下结论:

var CRC8_数据='005EBCE2613FDD83C29C7E20A3FD1F419DC3217FFCA2401E5F01E3BD3E6082DC237D9FC1421CFEA0E1BF5D0380DE3C6225CDF8163D7C22C09E1D43A1F4618FAA427799BC584DA866E5B5907DB856739BAE40617A5FB7826C49A653BD987045AB8E6A7F91B46987A2F84F468B417B417B417B417B418B418B418B418B418B4F468B6F468F468F468CF417CF418F418F418F417FAFAFAFAFADC718F417B418CFCFC2738F418CFB1718CF418F418CFB1738CF418CF414DCE90722C6D33D18F0C52B0EE326C8ED0530DEFB1F0AE4C1291CF2D73CA947628ABF517490856B4EA6937D58B5709EB53688AD495CB2977F4AA4816E9B7550B88D6346A2B7597C94A14F6A8742AC896154BA9F7B6E80A54D7896B35';
功能strtarr(str){
var arr=str.match(/[0-9a-f]{2}/ig);//转换为十六进制对数组
arr=arr.map(x=>parseInt(x,16));//将十六进制对转换为整数(字节)
返回arr;
}
CRC8_数据=STROARR(CRC8_数据);
函数计算器ECRC8(bArr){
var i=1;
var i2=巴尔长度-1;
var b=0;

虽然(我可能是一个很好的开始。通过谷歌搜索“js crc8”找到它)似乎还有许多其他NPM软件包和github回购协议。如果您在问题中包含这样的信息,那将是非常体贴的。否则没有人会知道您尝试了什么。也许您可以阅读并编辑您的问题,然后相应地编辑您的问题?就我个人而言,如果我看到您尝试的代码,解释说“这是我期望的答案,但这是我得到的答案。”我注意到您的示例代码有两个方面:您有十六进制字符串,因此我怀疑您希望以
[0x02,0xfd,0x10,…]
结束。这不是使用
charCodeAt得到的结果
(function() {
    'use strict';

    if(typeof(window.Checksum) === "undefined") {
        throw "The Checksum class is required for this code.";
    }

    var prime = 0x01000193;

    /**
     * Initialize anything you want in the constructor, such as setting up a lookup
     * table of bytes. Make sure to cache your calculations, so they only have to be
     * done once.
     */
    var FNV32 = function FNV32() {
        this.init = 2166136261; // fnv-1!
    };

    /**
     * The setup method which will be called when new Checksum("fletcher", ...) is called.
     * This method is supposed to initialize the checksum cipher and to recieve parameters
     * from the constructor.
     *
     * @param {Number} mode the FNV32 mode (FNV-1 (defualt) or FNV-0)
     */
    FNV32.prototype.setup = function(mode) {
        if(mode === 0) {
            this.init = 0; // fnv-0.
        }
    };

    FNV32.prototype.array = function(a, p) {
        var len = a.length,
            fnv = p || this.init;

        for(var i = 0; i < len; i++) {
            fnv = (fnv + (((fnv << 1) + (fnv << 4) + (fnv << 7) + (fnv << 8) + (fnv << 24)) >>> 0)) ^ (a[i] & 0xff);
        }

        return fnv >>> 0;
    };

    FNV32.prototype.single = function(b, p) {
        var fnv = p || this.init;
        return ((fnv + (((fnv << 1) + (fnv << 4) + (fnv << 7) + (fnv << 8) + (fnv << 24)) >>> 0)) ^ (b & 0xff)) >>> 0;
    };

    Checksum.registerChecksum("fnv32", FNV32);
}());
System.out.print(bytesToHex(CRC8_DATA));
...
private static final char[] HEX_ARRAY = "0123456789ABCDEF".toCharArray();
public static String bytesToHex(byte[] bytes) {
    char[] hexChars = new char[bytes.length * 2];
    for (int j = 0; j < bytes.length; j++) {
        int v = bytes[j] & 0xFF;
        hexChars[j * 2] = HEX_ARRAY[v >>> 4];
        hexChars[j * 2 + 1] = HEX_ARRAY[v & 0x0F];
    }
    return new String(hexChars);
}