簡體   English   中英

在Swift中反向CRC-32 NSData

[英]Reverse CRC-32 NSData in Swift

我認為答案的組成部分已經存在,但是我對這方面的知識還不夠了解,而且轉換非常困難。

這是我發現的NSData到crc32的實現:

https://github.com/krzyzanowskim/CryptoSwift/blob/643bbabd6781b6e226f18815dba616cf6a08629b/CryptoSwift/CRC.swift

不幸的是,我需要一個與之相反的版本:

該線程似乎最接近: 反轉CRC32

我已使用其邏輯來創建此邏輯,該邏輯生成了兩個CRC表:

func crcTables() -> (forwardTable: [UInt32], reverseTable: [UInt32]) {
    let poly: UInt32 = 0xedb88320;

    var forwardTable: [UInt32] = []
    var reverseTable: [UInt32] = []

    var forward: UInt32 = 0
    var reverse: UInt32 = 0
    for i in 0...UInt32(UInt8.max) {
        forward = i
        reverse = i << (3 * 8)

        for _ in 1...8 {
            if (forward & 1) == 1 {
                forward = (forward >> 1) ^ poly
            } else {
                forward >>= 1
            }

            if (reverse & 0x80000000) != 0 {
                reverse = ((reverse ^ poly) << 1) | 1
            } else {
                reverse <<= 1
            }
        }

        forwardTable.append(forward)
        reverseTable.append(reverse)
    }

    return (forwardTable, reverseTable)
}

但是,現在我非常着迷於如何獲取數據並創建反向crc32:

func reverseCRC(data: NSData) -> UInt32 {
    var bytes = [UInt8](count: data.length, repeatedValue: 0)
    data.getBytes(&bytes, length:data.length * sizeof(UInt8))


    return 0
}

更新

通過各種搜索,我得出了以下結論:

func reverseCRC32WithData(data: NSData, wantedCRC: UInt32 = 0) -> UInt32 {
    var reversedCRC = wantedCRC

    var bytes = [UInt8](count: data.length, repeatedValue: 0)
    data.getBytes(&bytes, length:data.length * sizeof(UInt8))

    // Drop trailing 1 if exists
    let bufferLength = (data.length >> 1) << 1

    for i in 0.stride(to: bufferLength + 4, by: sizeof(UInt16)) {
        var word: UInt16 = 0x0000
        if i < bufferLength {
            let b1 = bytes[bufferLength - 2 - i]
            let b2 = bytes[bufferLength - 1 - i]
            word = (UInt16(b1) << 8) | UInt16(b2)
        } else {
            word = 0xffff
        }

        reversedCRC = ((reversedCRC << 8) & 0xffffffff) ^ ReverseTable[Int((reversedCRC >> 24) & 0xff)] ^ (UInt32(word) >> 8) & 0xff
        reversedCRC = ((reversedCRC << 8) & 0xffffffff) ^ ReverseTable[Int((reversedCRC >> 24) & 0xff)] ^ (UInt32(word) & 0xff)
    }

    return reversedCRC
}

但是,我不太了解它(尤其是最后兩行),而且我不確定如何測試其准確性。 如果有人可以朝這個方向提供幫助。

目標

我有一個固件更新,該固件要通過藍牙傳輸到硬件,一旦傳輸了所有固件更新數據,便以以下形式提交驗證有效載荷:

CRC反轉32(Big Endian)

CRC反轉32(Big Endian)

這聽起來像只是意味着普通的CRC-32,以big-endian順序發送。 大多數CRC是使用位反轉多項式以位反轉順序生成的,因為這會使代碼更簡單。

“大尾數”部分是獨立的,指的是以下事實:一旦有了一個四字節的值(可能已生成),就可以按大尾數順序或小尾數順序將其放入字節流。 規范是以大端順序將其放入流中,即,最高有效字節在前。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM