Ios 如何计算二进制校验和?

Ios 如何计算二进制校验和?,ios,checksum,Ios,Checksum,我正在开发一个硬件通信应用程序,可以从外部硬件发送或请求数据。我已经完成了所需数据部分 我刚刚发现我需要一些帮助来计算校验和 将包创建为NSMutableData,然后在发送前将其转换为字节数组。 一个包如下所示: 0x1E 0x2D 0x2F数据校验和 我想我可以把十六进制转换成二进制,一个接一个地计算它们。但我不知道这是不是个好主意。请让我知道这是唯一的方法,或者有一些内置函数我不知道。 如有任何建议,将不胜感激 package org.example.checksum; public c

我正在开发一个硬件通信应用程序,可以从外部硬件发送或请求数据。我已经完成了所需数据部分

我刚刚发现我需要一些帮助来计算校验和

将包创建为NSMutableData,然后在发送前将其转换为字节数组。 一个包如下所示:

0x1E 0x2D 0x2F数据校验和

我想我可以把十六进制转换成二进制,一个接一个地计算它们。但我不知道这是不是个好主意。请让我知道这是唯一的方法,或者有一些内置函数我不知道。 如有任何建议,将不胜感激

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#的代码,我将尝试在我的应用程序中使用它。如果可以,我会和你分享。不过,任何建议都将不胜感激

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;

  }

}
package org.example.checksum;
公共类InternetChecksum{
/**
*计算缓冲区的Internet校验和(RFC 1071-http://www.faqs.org/rfcs/rfc1071.html)
*算法是
*1)在所有八位字节上应用16位1的补码和(相邻的8位对[a,B],最终奇数长度为[a,0])
*2)对该最终金额使用1的补码
*
*注:
*1的补码不是按位的正值。
*确保所有进位都被加回,以避免一个接一个的错误
*
*
*@param buf消息
*@返回校验和
*/
公共长计算器checksum(字节[]buf){
int length=buf.length;
int i=0;
长和=0;
长数据;
//处理所有对
而(长度>1){
//更正为包含@Andy的编辑和关于堆栈溢出的各种注释

数据=((buf[i]当我一年前发布这个问题时,我对Objective-C还是相当陌生的。事实证明这是一件非常容易做到的事情

计算校验和的方式取决于在通信协议中如何定义校验和。在我的情况下,校验和只是之前发送的所有字节或要发送的数据的总和

因此,如果我有一个NSMutableData*cmd,它有五个字节:

0x10 0x14 0xE1 0xA4 0x32

校验和是0x10+0x14+0xE1+0xA4+0x32的最后一个字节

所以和是01DB,校验和是0xDB

代码:

要使用它:

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

希望能有所帮助。

一年前,当我发布这个问题时,我对Objective-C还是相当陌生的。事实证明,这是一件非常容易做到的事情

计算校验和的方式取决于在通信协议中如何定义校验和。在我的情况下,校验和只是之前发送的所有字节或要发送的数据的总和

因此,如果我有一个NSMutableData*cmd,它有五个字节:

0x10 0x14 0xE1 0xA4 0x32

校验和是0x10+0x14+0xE1+0xA4+0x32的最后一个字节

所以和是01DB,校验和是0xDB

代码:

要使用它:

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

希望能有帮助。

为什么不使用简单的C CRC32?@H2CO3嗨,你能给我解释得更详细一点吗?我试着读了,但仍然不太清楚如何使用它。谢谢。@只需使用名为CalculateC32MemoryBuffer的函数,其他的都是噪音。@ZuzooVn当然。我今天晚些时候会发布我的答案。@ZuzooVn我发布了我的答案。@ZuzooVn回答。希望有帮助。为什么不使用一个简单的C CRC32?@H2CO3嗨,你能给我解释得更详细一点吗?我试着读了,但仍然不太清楚如何使用它。谢谢。@只需使用名为CalculateC32MemoryBuffer的函数,其他的都是噪音。@ZuzooVn当然。我今天晚些时候会发布我的答案。@ZuzooVn我发布了我的答案。希望对你有所帮助。我用校验和的另一种方式:。你能看一下吗?我用校验和的另一种方式:。你能看一下吗?