2013-05-05 2 views
1

주어진 바이트 배열을 int로 변환하고 싶습니다. 그런 다음 프로세스를 취소하고 싶습니다. 그 int에서 원래 바이트 배열을 다시 얻고 싶습니다. 나는 이런 일이 일한 것이라고 생각 : C# byte [] to long and back

byte[] myBytes = { 0, 0, 0, 32 }; 
if (BitConverter.IsLittleEndian) 
    Array.Reverse(myBytes); 
int i = BitConverter.ToInt32(myBytes, 0); 
Console.WriteLine("int: {0}", i); // Output: 32 

byte[] newBytes = BitConverter.GetBytes(i); 
Console.WriteLine("byte array: " + BitConverter.ToString(newBytes)); 
// Outputs: 20-00-00-00 

그래서 원래 바이트 배열을 나에게 다시 제공하지 않습니다. 내가 도대체 ​​뭘 잘못하고있는 겁니까?

답변

2

당신은 명백한 이유 Array.Reverse와 바이트를 반대하고 - 당신이int에서int로 모두 변환 에 대한 BitConverter을 사용하고 있는지, 당신이 전혀 Array.Reverse 전화를하지 않아도 주어진. 당신이 빅 엔디안으로 바이트 배열을 처리하려는 당신이 리틀 엔디안 BitConverter에 직면하는 경우

, 당신은 모두가지 경우, 단지 하나의 배열을 반대해야합니다. 기본적으로 당신은 가역 변환을 제공하는 것으로 BitConverter을 고려해야하지만, 원하는 정확한 변환이 아닐 수도 있습니다.

이 종류의 변환에 엔디 언을 지정하려면 내 MiscUtil 프로젝트에서 내 EndianBitConverter을 사용하고 싶을 수 있습니다.

+0

답변 해 주셔서 감사합니다. 나는 엔디안에 전혀 관심이 없으며 Array.reverse를 제거하면 00-00-00-20을 출력합니다. 원래 배열은 00-00-00-32 였으므로 원래의 배열은 여전히 ​​얻지 못했습니다. 나중에 EndianBitConverter를 사용해 보겠습니다. – Jonathan

+1

@Jonathan : 아니요, 원래 배열은''00-00-00-20 "'이었습니다. 왜냐하면'BitConverter.ToString'은 16 진수로 포맷하기 때문에 배열 초기화 자에서 * decimal * 리터럴을 사용하기 때문입니다. 'Console.WriteLine ("바이트 배열 :"+ BitConverter.ToString (myBytes));'를 시작하면 내가 무슨 뜻인지 알게 될 것이다. –

+0

예, BitConverter.ToString이 나를 혼란스럽게 만들었습니다. 도와 줘서 고마워! – Jonathan