문제

이미 알고 있듯이 C#으로 마이그레이션하고 C ++의 일부는 다르게 보입니다.

C ++ 코드

    BYTE packetBuffer[32] = {0};
    *(LPWORD)(packetBuffer + 0) = 0xC;
    *(LPWORD)(packetBuffer + 2) = 0x5000;
    *(LPDWORD)(packetBuffer + 6) = dwArgs[13];
    *(LPDWORD)(packetBuffer + 10) = *(keyArray2 + 0);
    *(LPDWORD)(packetBuffer + 14) = *(keyArray2 + 1);

참고 Dwargs 및 KeyArray2는 "DWORD 배열"입니다.

이것이 바로 배치 된 방법입니다

  1. PacketBuffer [0]은 0xC입니다
  2. PacketBuffer [1]는 0x00입니다
  3. PacketBuffer [2]는 0x50입니다
  4. PacketBuffer [3]는 0x00입니다

등등

C#에서 어떻게 하는가?

나는 이것을 시도했지만 작동하지 않습니다

packetBuffer[0] = 0xC;
packetBuffer[2] = (byte)0x5000; //error
packetBuffer[6] = (byte)dwArgs[13];
도움이 되었습니까?

해결책

당신이 사용할 수있는 BitConverter 바이트 배열로 데이터를 변환합니다. 불행히도 기존 배열에 복사 할 시설이 없습니다. 내것의 EndianBitConverter잘못된 도서관 필요한 경우이를 허용하고 물론 사용에 대한 엔지니어를 지정할 수 있습니다. (BitConverter .NET에서 일반적으로 Endian이 아닙니다. IsLittleEndian 필드.)

예를 들어:

EndianBitConverter converter = EndianBitConverter.Little;
converter.CopyBytes((short) 0xc, packetBuffer, 0);
converter.CopyBytes((int) 0x5000, packetBuffer, 2);
converter.CopyBytes(dwArgs[13], packetBuffer, 6);

int 두 번째 전화에서 CopyBytes 중복이지만 명확성을 위해 포함됩니다 (이전 줄을 염두에두고 있습니다!).

편집 : 다른 대안 .net 표준 라이브러리를 고수하려면 사용하고 싶을 수도 있습니다. BinaryWriter a MemoryStream.

다른 팁

당신은 할 수 없습니다. C#이 강력하게 입력되었습니다. 변수에는 하나의 유형 만 있습니다. C ++ RenterPret_cast와 같은 속임수는 허용되지 않습니다.

그래도 문제에 대한 몇 가지 접근 방식이 있습니다. 첫 번째는 명백한 것은 내장 직렬화 프레임 워크를 사용하는 것입니다. 당신이 필요하지 않는 한 자신의 직렬화 코드를 작성하지 마십시오. .NET에서는 종종 필요하지 않습니다.

두 번째는 BitConverter 클래스를 사용하는 것입니다 (GetBytes 메소드는 바이트 어레이로 변환하기위한 트릭을 수행해야합니다).

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