2017-08-02 12 views
-1

私は線形フィードバックシフトレジスタで作業しています。次のロジックを安全に書かなければなりません。客観的なCと比較してより安全なので、私は迅速に選択しました CのロジックとしてCファイル自体を使用していますか?私は、次の迅速Swiftこのコードの3.1等価ロジック

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コードを書くために私を助けてくださいSWIFT 3.1

enter image description here

答えて

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文字以外の文字を含むStringを処理しないように注意してください。