2012-10-17 5 views
4

문자열 "0AAE0000463130004144430000"이 있고 문자열을 구성하는 16 진수 바이트의 2의 보수 체크섬을 계산해야합니다.16 진수 문자열의 2의 보수 체크섬 계산

예 문자열 수식 위에서

  1. 합계 값이다 0A + AE + 00 + 00 + 46 + 31 + 30 + 00 + 41 + 44 + 43 + 00 + 00 = 27 (
  2. 는 = 0xD9로 0x100에서 결과를 빼기) 오버 플로우를 폐기

D9이 예제에 대한 올바른 체크섬,하지만 난 문제가 C#에서 문자열에서 구문 분석 두 자리 16 진수 값을 얻는 데. 내 현재 코드는 다음과 같습니다 :

string output = "0AAE0000463130004144430000"; 
long checksum = 0; 
char[] outputBytes = output.TrimStart(':').ToCharArray(); 

foreach (var outputByte in outputBytes) 
{ 
    checksum += Convert.ToInt32(outputByte); 
    checksum = checksum & 0xFF; 
} 

checksum = 256 - checksum; 

그러나, 이것은 지금까지 내가 말할 수있는 ASCII 값을 합산하고, 각각의 문자를하고있다.

+0

음을 반환합니다, 당신은 문자열의 각 문자를 통해 가고있다 - 당신이 먼저 바이트 표현으로 각 쌍으로 변환되지 않습니다. – Oded

+0

byte []로 전환하면 outputBytes = GetBytes (output.TrimStart (':'))); 나는 여전히 같은 (잘못된) 값을 얻는다. – Crake

답변

7

당신은 System.Runtime.Remoting.Metadata.W3cXsd2001에 SoapHexBinary 클래스를 사용할 수 있습니다.

soapHexBinary.Value 속성은 당신에게 바이트 배열

string hexString = "0AAE0000463130004144430000"; 
byte[] buf = SoapHexBinary.Parse(hexString).Value; 

int chkSum = buf.Aggregate(0, (s, b) => s += b) & 0xff; 
chkSum = (0x100 - chkSum) & 0xff; 

var str = chkSum.ToString("X2"); // <-- D9 
+10

왜 나는 믿을만한 System.Runtime.Remoting.Metadata.W3cXsd2001 네임 스페이스를 즉시 보지 않았습니까? :) – Crake

+0

또한 완벽하게 작동했습니다. 감사합니다. – Crake

+0

Convert.ToInt32()를 사용할 수 있습니다. 16 진수 문자열에 "0x"를 추가하면 Convert는 데이터를 문제없이 16 진수로 인식합니다. – Kamil

2

대신 사용해보십시오. SubString을 사용하여 한 번에 두 개의 문자를 잡고, NumberStyles.AllowHexSpecifier와 함께 int.Parse를 사용하여 한 쌍의 문자를 16 진수 값으로 읽습니다.

string output = "0AAE0000463130004144430000"; 
int checksum = 0; 

// You'll need to add error checking that the string only contains [0-9A-F], 
// is an even number of characters, etc. 
for(int i = 0; i < output.length; i+=2) 
{ 
    int value = int.Parse(output.SubString(i, 2), NumberStyles.AllowHexSpecifier); 
    checksum = (checksum + value) & 0xFF; 
} 

checksum = 256 - checksum;