C# Blowfish Net을 사용한 문제 : UINT32 []에서 BYTE []로 변환하는 방법

StackOverflow https://stackoverflow.com/questions/692810

  •  22-08-2019
  •  | 
  •  

문제

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)에서 배열에 대한 다른보기를 제공합니다.

물론 성능이 문제 인 경우에만 사용해야합니다 (조기 최적화를 피하십시오).

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top