C# Blowfish Net을 사용한 문제 : UINT32 []에서 BYTE []로 변환하는 방법
문제
C#에서는 blowfish.net 2.1.3의 blowfishecb.cs 파일을 사용하고 있습니다.여기에서 찾을 수 있습니다)
C ++에서는 알려지지 않았지만 비슷합니다.
C ++에서는 초기화 (Blowfish) 절차가 다음과 같습니다.
void cBlowFish::Initialize(BYTE key[], int keybytes)
C#에서 초기화 (Blowfish) 절차는 동일합니다.
public void Initialize(byte[] key, int ofs, int len)
이게 문제 야:
이것이 C ++에서 키가 초기화되는 방법입니다.
DWORD keyArray[2] = {0}; //declaration
...some code
blowfish.Initialize((LPBYTE)keyArray, 8);
보시다시피, 키는 총 8 바이트 인 두 개의 dword 배열입니다.
C#에서는 그렇게 선언하지만 오류가 발생합니다.
BlowfishECB blowfish = new BlowfishECB();
UInt32[] keyarray = new UInt32[2];
..some code
blowfish.Initialize(keyarray, 0, 8);
오류 오차는 다음과 같습니다. 오차는 다음과 같습니다. 오차는 다음과 같습니다.
인수 '1': 'uint []'에서 'byte []로 변환 할 수 없습니다.
내가 뭘 잘못하고 있죠?
미리 감사드립니다!
해결책
당신이 사용할 수있는 비트 컨버터 UINT32에서 바이트를 얻습니다.
이렇게하려면 각 요소를 루프로 변환해야합니다. 나는 다음과 같은 일을 할 것입니다.
private byte[] ConvertFromUInt32Array(UInt32[] array)
{
List<byte> results = new List<byte>();
foreach(UInt32 value in array)
{
byte[] converted = BitConverter.GetBytes(value);
results.AddRange(converted);
}
return results.ToArray();
}
돌아가려면 :
private UInt32[] ConvertFromByteArray(byte[] array)
{
List<UInt32> results = new List<UInt32>();
for(int i=0;i<array.Length;i += 4)
{
byte[] temp = new byte[4];
for (int j=0;j<4;++j)
temp[j] = array[i+j];
results.Add(BitConverter.ToUInt32(temp);
}
return results.ToArray();
}
다른 팁
VS2008 또는 C# 3.5를 사용하는 경우 다음 LINQ + BITCONVERTER 솔루션을 사용해보십시오.
var converted =
keyArray
.Select(x => BitConverter.GetBytes(x))
.SelectMany(x => x)
.ToArray();
이것을 무너 뜨립니다
- 선택은 모든 uint32를 바이트 []로 변환합니다. 결과는 ienumerable입니다u003Cbyte[]>
- SelectMany는 플랫을 ienumerable이라고 부릅니다u003Cbyte[]> ienumerableu003Cbyte>
- ToArray ()는 열거 가능한 것을 배열로 변환합니다.
편집하다 비 LINQ 솔루션도 마찬가지로 작동합니다
List<byte> list = new List<byte>();
foreach ( UInt32 k in keyArray) {
list.AddRange(BitConverter.GetBytes(k));
}
return list.ToArray();
필요한 경우 더 빠르게 값 유형을 변환하는 방법은 다음 답변에서 설명한 해킹을 사용할 수 있습니다. float []를 바이트 []로 변환하는 가장 빠른 방법은 무엇입니까?
이 해킹은 메모리 할당 및 반복을 피합니다. O (1)에서 배열에 대한 다른보기를 제공합니다.
물론 성능이 문제 인 경우에만 사용해야합니다 (조기 최적화를 피하십시오).