외부 하드웨어에서 데이터를 보내거나 요구하는 하드웨어 통신 앱을 만들고 있습니다. 데이터 부분을 완료해야합니다.바이너리 체크섬을 계산하는 방법은 무엇입니까?
그리고 나는 체크섬을 계산하는 데 도움이 될만한 것을 찾았습니다.
패키지가 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;
}
}
간단한 일반 C CRC32를 사용하지 않는 이유는 무엇입니까? http://www.csbruce.com/~csbruce/software/crc32.c –
@ H2CO3 안녕하세요, 제게 좀 더 자세히 설명해 주시겠습니까? 나는 그것을 읽으려고 노력했지만 여전히 그것을 사용하는 방법을 확실히 모른다. 고맙습니다. – user1491987
@ 그냥 CalculateCRC32MemoryBuffer와 같은 함수를 사용하십시오. 나머지는 노이즈입니다. –