Я работаю над регистром сдвига с линейной обратной связью, я должен безопасно написать следующую логику, я выбрал быстрый, так как он более безопасен по сравнению с целью c, защищен ли он, если я использую следующую логику C в качестве самого файла C? если нет, я пытаюсь быстро написать следующий фрагмент кода

char * lfsr16_obfuscate( char *s, unsigned int length, unsigned int seed)
{
    unsigned int i, lsb;
    unsigned int lfsr = seed;

    for (i = 0; i < length*8; i++)          
    {
        lsb = lfsr & 1u;                
        lfsr >>= 1u;                    
        if (lsb == 1u)
        {
            lfsr ^= 0xB400u;
            s[i / 8] ^= 1 << (i % 8);   
        }
    }

    return s;
}

Ниже приводится быстрый equelent, который я пробовал, но он дает сбой, как на следующем снимке экрана, пожалуйста, помогите мне написать приведенный выше код C в быстром 3.1

enter image description here

-1
Ravi Kiran 2 Авг 2017 в 09:49

1 ответ

Лучший ответ

Я действительно не знаю о LFSR, но, учитывая представленный вами код C, я думаю, что быстрый порт может быть таким:

func lfsr16_obfuscate(data: String, seed: Int) -> String {
    var scalars = Array(data.unicodeScalars).map { UInt8($0.value) }
    let len = data.characters.count
    var lsb: UInt
    var lfsr = UInt(seed)

    for i in (0..<len*8) {
        lsb = lfsr & 1
        lfsr >>= 1
        if 1 == lsb {
            lfsr ^= 0xB400
            scalars[i / 8] ^= UInt8(1 << (i % 8))
        }
    }

    return String(bytes: scalars, encoding: .ascii)!
}

Убедитесь, что с помощью этой функции вы не будете обрабатывать строку, содержащую символы, отличные от символов ASCII.

1
Nandin Borjigin 2 Авг 2017 в 10:42