如何对JavaScript中的原始二进制数据使用位运算符进行CRC检查?

2024-09-30 01:19:34 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在将一个用Python编写的CRC检查函数移植到JavaScript中,这让我有些费劲。你知道吗

下面是工作的Python代码:

from BitVector import BitVector  # BitVector==3.4.8


def compute_crc(message):
    message = message.deep_copy()
    generator = BitVector(bitstring='1111111111111010000001001')
    crc_length = len(generator) - 1
    content_length = len(message) - crc_length

    assert content_length >= 0

    for i in range(content_length):
        if message[i]:
            message[i:i + len(generator)] ^= generator

    return message[-crc_length:]


adsb_hex = "8D4840D6202CC371C32CE0576098"
adsb_crc = compute_crc(BitVector(hexstring = adsb_hex))

if int(adsb_crc) != 0:
    print 'Bad'
else:
    print 'Good'

以下是我的(糟糕的)JavaScript代码:

function BinToDec(binStr)
{
    var regexp = /^[01]+$/
    if (!regexp.test(binStr)) {
        return false;
    }
    var result = parseInt(binStr, 2);
    if (isNaN(result)) {
        return false;
    }
    return result;
}

function StrToBinArray(binStr)
{
    var result = new Array();
    for (var i = 0; i < binStr.length; i++) {
        result[i] = binStr[i] === '0' ? 0 : 1;
    }
    return result;
}

function TestCRC(adsbBinStr)
{
    var genStr = '1111111111111010000001001';
    var generatorInt = BinToDec(genStr);
    var generator = StrToBinArray(genStr);
    var crcLength = generator.length - 1;
    var contentLength = adsbBinStr.length - crcLength;

    if (contentLength < 0) {
        return false;
    }

    var adsbBin = StrToBinArray(adsbBinStr);

    for (var i = 0; i <= contentLength; i++) {
        if (adsbBin[i]) {
            var currSlice =  adsbBin.slice(i, i + generator.length);
            var currSliceInt = BinToDec(BinArrayToStr(currSlice));
            var currCheck = currSliceInt ^ generatorInt;
            var currCheckBin = currCheck.toString(2);

            for (var j = 0; j <= currCheckBin.length; j++) {
                adsbBin[i + j] = currCheckBin[j];
            }
        }
    }


    return BinToDec(BinArrayToStr(adsbBin.slice(contentLength + 2))) === 0;
}

TestCRC('1000110101001000010000001101011000100000001011001100001101110001110000110010110011100000010101110110000010011000');

如果有帮助的话,这里的CRC检查是伪码:

GENERATOR = 1111111111111010000001001

MSG = binary("8D4840D6202CC371C32CE0576098")  # total 112 bits

FOR i FROM 0 TO 88:                           # 112 - 24 parity bits
  if MSG[i] is 1:
    MSG[i:i+24] = MSG[i:i+24] ^ GENERATOR

CRC = MSG[-24:]                               # last 24 bits

IF CRC not 0:
  MSG is corrupted

TLDR我正在努力将message[i:i + len(generator)] ^= generator从Python正确地移植到JavaScript,我需要帮助。你知道吗


Tags: messageforlenreturnifvarmsgresult
1条回答
网友
1楼 · 发布于 2024-09-30 01:19:34

根据Python代码,这可能是Javascript中的另一种选择。你知道吗

// just some util functions to replace BitVector functionality // https://stackoverflow.com/a/12987042/4209136 function checkBin(n){return/^[01]{1,64}$/.test(n)} function checkDec(n){return/^[0-9]{1,64}$/.test(n)} function checkHex(n){return/^[0-9A-Fa-f]{1,64}$/.test(n)} function Bin2Dec(n){if(!checkBin(n))return 0;return parseInt(n,2).toString(10)} function Dec2Bin(n){if(!checkDec(n)||n<0)return 0;return n.toString(2)} function Hex2Bin(n){if(!checkHex(n))return 0;return parseInt(n,16).toString(2)} function ZeroPad(num, size) { var result = String(num); while (result.length < size) { result = '0' + result; } return result; } function computeCrc(message) { var generator = '1111111111111010000001001'; var genInt = Bin2Dec(generator); var crcLength = generator.length - 1; var contentLength = message.length - crcLength; if (contentLength < 0) { throw 'Invalid content length.'; } for (var i = 0;i < contentLength;i++) { if (message[i] === '0') continue; let curInt = Bin2Dec(message.substr(i, i + generator.length)); message = message.substr(0, i) + ZeroPad(Dec2Bin(curInt ^ genInt), generator.length) + message.substr(i + generator.length); } return message.substr(message.length - crcLength); } var adsbCrc = computeCrc(Hex2Bin("8D4840D6202CC371C32CE0576098")); console.log(parseInt(adsbCrc) === 0 ? 'Good' : 'Bad');

相关问题 更多 >

    热门问题