2013-07-11 7 views
0

는 바이트 배열의 모든 바이트를 추가 할 수있는 최선의 방법은 무엇여러 바이트를 추가하고 바이트 배열을 얻는 방법?

byte[] someBytes = { 0xFF, 0xFE, 0xFE, 0xFF, 0x11, 0x00 ,0x00 ,0x00 ,0x00} 

을 감안할 때? 수동 때문에 바람직 내가 좋아하는 뭔가 끝내고 싶습니다 내 위의 예에서 (40B)를 얻을 것 진수 숫자로 손으로 모든 바이트를 추가 : 사실

byte[] byteSum = { 0x04, 0x0B } 

, 정말 필요한 것은 사용에는 0x0B 부분 (이다 체크섬 용). 체크섬은이 경우 0x0B XOR 0x55 (0x5E를 산출 함)에 의해 계산됩니다.

정상적인 추가 바이트 수는 아니지만 체크섬 계산 방법입니다.

바이트 배열을 수동으로 반복하고 결과를 더하면 정수 합계가됩니다.

이 작업을 수행하는 가장 간단한 방법은 무엇입니까?

+0

당신은 나머지 연산자를 사용하는 것이 좋습니다 :'0x040B의 %의 0x0100은 == 0x000B'가 모듈로 연산자는 다른 하나의 수를 분할을하고, 반환 나머지 부문. – Nolonar

+0

@Nolonar 0x040B를 얻는 방법을 알아 내면 꽤 유용 할 것입니다. D 감사합니다. – l46kok

+0

0x40B를 얻는 방법을 이해하지 못합니다. 합계는 1129 또는 0x469입니다. "추가"란 무엇입니까? –

답변

2

음,

byte checksum; 
foreach (var b in someBytes) 
{ 
    checksum = (byte)((checksum + b) & 0xff); 
} 
+0

+1'& 0x00FF'는'% 0x0100'보다 빠릅니다. – Nolonar

+0

'+'는 자동으로'int'로 승격되기 때문에'ushort'에 대한 캐스트는 불필요합니다. – CodesInChaos

2

은 내가 당신의 질문을 이해 있는지 확실하지 않습니다 ...하지만 내가 어떻게 할 것입니다 :

byte sum = 0; 
foreach (byte b in someBytes) 
{ 
    unchecked 
    { 
     sum += b; 
    } 
} 

을하지만 이것은에는 0x0B를 양보하지 않지만, 0x69. 결국 byte에 LINQ의 합과 캐스팅을 사용

+0

그는 분명히 바이트를 추가하려고하고, 오버플로되면 새로운 바이트를 생성합니다. 따라서 바이트 배열을 만듭니다. –

+0

@ AndréSnedeHansen하지만 그는 마지막 바이트에만 관심이 있습니다. 그래서 ... –

+0

은 캐스팅과 마스킹을 피합니다. +1, 그 바이트에는 부호가 없습니다. – Jodrell

1

:

unchecked 
{ 
    var checksum = (byte)(someBytes.Sum(b => (long)b)^0x55); 
} 
+0

'long'을 오버플로 할만큼 충분한 바이트가 있다면 (나는 많은 바이트를 알고있다.) ... – Jodrell

+1

@Jodrell 배열의 최대 크기가 현재 CLR에서 20 억 바이트라고 가정하면 이것은 불가능하다. 또한 현재 AMD64 CPU의 최대 RAM 크기보다 큽니다. 이유 때문에 오버플로를 피하면서 int보다 길다. – CodesInChaos

+0

좋은 말투는 말합니다. – Jodrell

관련 문제