【问题标题】:How to check a buffer in C?如何检查C中的缓冲区?
【发布时间】:2012-02-08 16:10:23
【问题描述】:

我有一个大小为 1500 的缓冲区。在该缓冲区中,我需要检查 15 个字节是否全为零(从 100 到 115)。我们怎么能做到这一点(如果我们不使用任何循环)?数据是“无符号字符”类型,实际上它是一个无符号字符数组。

平台:Linux、C、gcc编译器

使用memcmp() 是否正确?我正在从智能卡读取一些数据并将它们存储在缓冲区中。现在我需要检查最后 15 个字节是否连续为零。 我在这里提到了memcmp(),因为我需要一种有效的方法;智能卡读取已经花费了一些时间。

或者进行按位比较是否正确。请建议。

【问题讨论】:

  • 听起来像是一道作业题,应该有作业标签。
  • 听起来像是一道作业题。查看 memcmp。
  • 不,你不需要什么特别快的东西。与读取智能卡相比,循环仍然会在眨眼间完成。
  • 与读取过程相比,缓冲区检查会非常快。效率在这里不是问题。是的,memcmp() 是一种可行的方法。您所指的零是 ASCII 数字 '0' 还是 ASCII NUL '\0'(零字节)?
  • memcmp 并不是特别适用。 memspnmemcchr 函数,如果存在的话。

标签: c linux string


【解决方案1】:
unsigned char buffer[1500];
...
bool allZeros = true;
for (int i = 99; i < 115; ++i)
{
    if (buffer[i] != 0)
    {
        allZeros = false;
        break;
    }
}

.

static const unsigned char zeros[15] = {0};
...
unsigned char buffer[1500];
...
bool allZeros = (memcmp(&buffer[99], zeros, 15) == 0);

【讨论】:

    【解决方案2】:

    使用循环。这是表达意图的最清晰、最准确的方式。编译器会尽可能优化它。通过自己“优化”它,你实际上可以让事情变得更糟。

    真实的故事,几天前发生在我身上:我正在“优化”两个 256 位整数之间的比较函数。旧版本使用for 循环来比较包含 256 位整数的 8 个 32 位整数,我将其更改为 memcmp。这是。事实证明,我的“优化”使编译器对两个缓冲区都是 32 位对齐的事实视而不见,导致它使用 less 有效的比较例程。无论如何,它已经优化了我的循环。

    【讨论】:

      【解决方案3】:

      100 到 115 不是 15 字节,是 16 字节。 我假设您的系统中的 int 大小为 16 字节。

      if (0 == *((unsigned int*)(buffer + 100))) {
               // all are  zero
      }
      

      【讨论】:

      • 这是未定义的行为,在某些平台上会导致未对齐的访问错误 (bus error)。
      • 这段代码不就是检查buffer[100]的地址是否为零吗?
      • I assume int size is 16 byte in your system. Lolwut?停下,你的意思是他有一个 sizeof(unsigned int) == 16 bytes == 128 bits 的系统?
      【解决方案4】:

      我是这样实现的:

      699 int is_empty_buffer(unsigned char *buff , size_t size)
      700 {
      701         return *buff || memcmp(buff , buff+1, size);
      702 }
      703 
      

      如果返回值为零,则为空

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-06-27
        • 1970-01-01
        • 1970-01-01
        • 2015-12-31
        • 1970-01-01
        • 2020-05-15
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多