2012-07-24 6 views
1

외부 하드웨어에서 데이터를 보내거나 요구하는 하드웨어 통신 앱을 만들고 있습니다. 데이터 부분을 완료해야합니다.바이너리 체크섬을 계산하는 방법은 무엇입니까?

그리고 나는 체크섬을 계산하는 데 도움이 될만한 것을 찾았습니다.

패키지가 NSMutableData로 생성되면 패키지를 보내기 전에 바이트 배열로 변환됩니다. 패키지는 다음과 같습니다 : 나는 그들에게 하나 하나를 계산하기 위해 바이너리로 진수로 변환 할 수 있습니다 생각하고

에 0x1E 0x2D 0x2F 데이터 검사. 그러나 그것이 좋은 생각인지 나는 모른다. 이 방법이 유일한 방법인지 또는 내가 모르는 기능이 있는지 알려 주시기 바랍니다. 제안 사항을 보내 주시면 감사하겠습니다.

BTW, 다른 게시물에서 C# 코드를 발견했습니다. 앱에서 작동하도록 노력하겠습니다. 할 수 있으면, 나는 너에게 그것을 나눌 것이다. 아직도 어떤 제안이라도 인정 될 것입니다.

package org.example.checksum; 

public class InternetChecksum { 

    /** 
    * Calculate the Internet Checksum of a buffer (RFC 1071 -  http://www.faqs.org/rfcs/rfc1071.html) 
    * Algorithm is 
    * 1) apply a 16-bit 1's complement sum over all octets (adjacent 8-bit pairs [A,B], final odd length is [A,0]) 
    * 2) apply 1's complement to this final sum 
    * 
    * Notes: 
    * 1's complement is bitwise NOT of positive value. 
    * Ensure that any carry bits are added back to avoid off-by-one errors 
    * 
    * 
    * @param buf The message 
    * @return The checksum 
    */ 
    public long calculateChecksum(byte[] buf) { 
int length = buf.length; 
int i = 0; 

long sum = 0; 
long data; 

// Handle all pairs 
while (length > 1) { 
    // Corrected to include @Andy's edits and various comments on Stack Overflow 
    data = (((buf[i] << 8) & 0xFF00) | ((buf[i + 1]) & 0xFF)); 
    sum += data; 
    // 1's complement carry bit correction in 16-bits (detecting sign extension) 
    if ((sum & 0xFFFF0000) > 0) { 
    sum = sum & 0xFFFF; 
    sum += 1; 
    } 

    i += 2; 
    length -= 2; 
} 

// Handle remaining byte in odd length buffers 
if (length > 0) { 
    // Corrected to include @Andy's edits and various comments on Stack Overflow 
    sum += (buf[i] << 8 & 0xFF00); 
    // 1's complement carry bit correction in 16-bits (detecting sign extension) 
    if ((sum & 0xFFFF0000) > 0) { 
    sum = sum & 0xFFFF; 
    sum += 1; 
    } 
} 

// Final 1's complement value correction to 16-bits 
sum = ~sum; 
sum = sum & 0xFFFF; 
return sum; 

    } 

} 
+0

간단한 일반 C CRC32를 사용하지 않는 이유는 무엇입니까? http://www.csbruce.com/~csbruce/software/crc32.c –

+0

@ H2CO3 안녕하세요, 제게 좀 더 자세히 설명해 주시겠습니까? 나는 그것을 읽으려고 노력했지만 여전히 그것을 사용하는 방법을 확실히 모른다. 고맙습니다. – user1491987

+0

@ 그냥 CalculateCRC32MemoryBuffer와 같은 함수를 사용하십시오. 나머지는 노이즈입니다. –

답변

1

나는이 질문을 1 년 전에 게시 할 때 Objective-C에 아직 아주 익숙했습니다. 그것은 매우 쉽게 할 수있는 것으로 판명되었습니다.

체크섬을 계산하는 방법은 통신 프로토콜에 체크섬이 정의되는 방법에 따라 결정됩니다. 필자의 경우 체크섬은 전송 된 모든 이전 바이트 또는 전송하려는 데이터의 합계 일뿐입니다.

나는 다섯 바이트가있는 NSMutableData * cmd를 가지고 그래서 경우 :

체크 그래서은 0x10 +하는 0x14 + 0xE1 + 0xA4 + 설정 0x32

의 마지막 바이트입니다

0x10을하는 0x14 0xE1 0xA4 설정 0x32을 합계가 01DB이고 체크섬이 0xDB입니다.

코드 :

//i is the length of cmd 
- (Byte)CalcCheckSum:(Byte)i data:(NSMutableData *)cmd 
{ Byte * cmdByte = (Byte *)malloc(i); 
    memcpy(cmdByte, [cmd bytes], i); 
    Byte local_cs = 0; 
    int j = 0; 
    while (i>0) { 
     local_cs += cmdByte[j]; 
     i--; 
     j++; 
    }; 
    local_cs = local_cs&0xff; 
    return local_cs; 
} 

그것을 사용하려면 :

Byte checkSum = [self CalcCheckSum:[command length] data:command]; 

그것이 도움이되기를 바랍니다.

+0

다른 방법으로 체크섬을 사용합니다 : http://stackoverflow.com/questions/19772650/checksum-of-a-hex-string-in-objective-c. 너는 그것을 볼 수 있 었는가? –

관련 문제