2009-03-28 6 views
0

이미 알고 있겠지만 저는 C#으로 마이 그 레이션하고 C++의 일부는 다르게 보입니다.C#에서 바이트 배열로 Dword를 캐스팅하는 방법

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이

  1. packetbuffer [0]에서 0xc
  2. packetbuffer 것이다 배치 어떻게이다

    "DWORD 배열"이다 [ 1]은 0x00이 될 것입니다

  3. packetbuffer [2]는 0x50이됩니다
  4. [3]
  5. packetbuffer는 × 00

어떻게 C#에서 그렇게에있을 것입니다?

나는 이것을 시도,하지만 당신은과 바이트 배열에서 데이터를 변환 할 BitConverter을 사용할 수 있습니다

packetBuffer[0] = 0xC; 
packetBuffer[2] = (byte)0x5000; //error 
packetBuffer[6] = (byte)dwArgs[13]; 

답변

2

작동하지 않습니다. 불행히도 기존 어레이에 복사 할 수있는 기능이 없습니다. 내 EndianBitConverter이 내 MiscUtil library 인 경우 필요하면이 항목을 허용 할뿐만 아니라 물론 사용할 엔디안을 지정할 수 있습니다. (BitConverter 보통 .NET에서 리틀 엔디안 - 당신이 IsLittleEndian 필드를 확인하실 수 있습니다.) 예를 들어

:

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

CopyBytes 두 번째 호출에서 int에 캐스팅, 중복하지만, 명확성을 위해 포함되었습니다 (이전 줄을 기억하십시오!).

EDIT : .NET 표준 라이브러리를 계속 사용하려면 MemoryStream과 함께 BinaryWriter을 사용하는 것이 좋습니다.

+0

@ 존 스키트, 감사합니다 도서관에서이 작업을 할 수 있는지 확인해주십시오.) 또한 어떻게 작동하는지 예를 들어 주시면 감사하겠습니다. –

+0

@ 존 : 나는 당신이 논평하는 동안 편집하고 있었다 : –

0

수 없습니다. C#은 강력한 형식입니다. 변수에는 단 하나의 유형 만 있습니다. C++ rekinpret_cast와 같은 속임수는 허용되지 않습니다.

문제에는 여러 가지 방법이 있습니다. 첫 번째, 그리고 명백한 것은 내장 직렬화 프레임 워크를 사용하는 것입니다. 필요한 경우가 아니면 자신의 serialization 코드를 작성하지 마십시오. 그리고 .NET에서는 자주 할 필요가 없습니다.

번째는 (바이트 배열 변환 트릭을한다 GetBytes 방법)에 BitConverter 클래스를 사용하는

+0

강력하게 타입 된 것은 정수 타입과 같은 원시 타입의 비트와 바이트를 피딩 할 수 없다는 것을 의미하지 않는다. CLR 타이핑 시스템에서 가장 강력한 제한은 참조 유형간에 캐스팅입니다. –

+0

@Cecil : 아니요, OP가 요청하는 유형 사이에 ** 전송 ** 할 수있는 방법이 없습니다.변환/직렬화 클래스 및 함수를 사용하여 소스 객체의 값을 기반으로 새 객체를 만들 수 있지만 한 유형의 객체를 가져올 수는 없으며 모든 유형, 이는 OP가 요구하는 구체적인 접근 방식입니다. – jalf

관련 문제