2015-04-12 88 views
1

我想在C#中實現XTEA算法,並且我找到了一個函數來爲我做這件事。獲取byte [16]到uint32 [4]

但是,我必須通過一個障礙。該功能要求將數據和密鑰放入UInt32數組中。

爲了時間的緣故,我只是將相關內容發佈到可用的格式。

這裏就是我想在C#僞代碼做:

  String keyStr = "foobar"; 
      byte[] keyBytes = Encoding.ASCII.GetBytes(keyStr); 
      /* keyBytes = 66, 6F, 6F, 62, 61, 72 (obviously I need to pad it 
      out to be followed by i 00's, i = 16 - keyBytes.Length); */ 

      UInt32[] keyArr = new UInt32[4]; 
      keyArr[0] = keyBytes[0 to 3]; 
      keyArr[1] = keyBytes[4 to 7]; 

我聽說,我需要使用位或,或類似的東西,但我不能完全肯定是如何工作的。我也聽說過使用BitConverter.ToString,正確解析它,然後假設結果是一個字符串:「666F6F62」,我可以將THAT轉換爲uint32的一個。但是這似乎是sl//懶惰/低效率。

在寫這個問題我也試過,也許它會澄清,即使它不工作:

  String keyStr = "foobar" 

      byte[] keyBytes = new byte[16]; 
      Encoding.ASCII.GetBytes(keyStr).CopyTo(keyBytes, 0); 

      UInt32[] keyArr = new UInt32[4]; 

      Buffer.BlockCopy(keyBytes, 0, keyArr[0], 0, 4); 

      Console.WriteLine("keyBytes[]: " + BitConverter.ToString(keyBytes)); 
      Console.WriteLine(keyArr[0].ToString()); 
+0

'BitConverter.ToUInt32'不適合你嗎? 「BlockCopy」有什麼「不起作用」? –

+0

@BenVoigt我完全忽略了這種可能性。而且我的方法確實有效,但我忘了解釋排列順序。 – Fuselight

回答

1

這應該這樣做......改編自

String keyStr = "foobar"; 

byte[] keyBytes = new byte[16]; 
Encoding.ASCII.GetBytes(keyStr).CopyTo(keyBytes, 0); 

UInt32[] keyArr = new UInt32[4]; 

if (BitConverter.IsLittleEndian) 
    Array.Reverse(keyBytes); 

for (int i = 0; i < 4; i++) 
    keyArr[i] = BitConverter.ToUInt32(keyBytes, i * 4); 

- https://msdn.microsoft.com/en-us/library/bb384066.aspx

+0

這個工程!非常感謝你。我不知道這會很簡單。 – Fuselight