C++ 无符号字符数组长度

C++ unsigned char array length

我的 C++ 程序中有十六进制值的无符号字符数组:

unsigned char buff[] = {0x03, 0x35, 0x6B};

我想计算这个数组的大小,以便我可以使用这个函数在 UART 端口 linux 上发送它:

if ((count = write(file,buff,length))<0)
{
    perror("FAIL to write on exit\n"); 
}

如我所见,长度是整数,buff是一个数组,可以在程序执行期间改变大小。 谁能帮我怎么写。谢谢

你可以用数组来做到这一点:

size_t size = sizeof array;

以你的例子给出:

ssize_t count = write(file, buff, sizeof buff);
if (count < 0 || (size_t)count != sizeof buff) {
  perror("FAIL to write on exit\n");
}

注意:我使用 C 语义,因为 write 来自 lib C。


在 C++ 中,您可以使用模板来确保对数组使用 sizeof

template<typename T, size_t s>
size_t array_sizeof(T (&array)[s]) {
    return sizeof array;
}

以你的例子给出:

ssize_t count = write(file, buff, array_sizeof(buff));
if (count < 0 || static_cast<size_t>(count) != array_sizeof(buff)) {
  perror("FAIL to write on exit\n");
}

作为获取元素数量的选项之一,您可以使用这样的模板:

template<typename T, size_t s>
size_t arrSize(T(&)[s])
{
    return s;
}

然后调用:

auto length = arrSize(buff);

这可以在各种数组类型的代码中使用。

如果数组大小是指它的总字节大小,您可以只使用sizeof(buff)。或者正如其他人所建议的那样,您可以使用 std::arraystd::vector 或任何其他容器来代替并编写这样的帮助程序:

template<typename T>
size_t byteSize(const T& data)
{
    typename T::value_type type;
    return data.size() * sizeof(type);
}

然后获取数据的实际字节大小你可以简单地调用:

std::vector<unsigned char> buff{0x03, 0x35, 0x6B};
auto bSize = byteSize(buff);

如果您使用的是 C++11,您可能会考虑切换到

#include <array>
std::array<char, 3> buff{ {0x03, 0x35, 0x6B} }; 

它为固定数组提供了类似于 std::vector(包括 sizedata)的接口。 使用 array 可能会避免一些常见错误并提供 <algorithm>.

涵盖的一些功能

write 的调用将是:

write(file,buff.data(),buf.size())

And I would like to calculate the size of this array so that I can send it on UART port linux using this function...

您需要 COUNTOF 宏或函数。在所有情况下都很难做到正确。例如,下面显示的已接受答案在使用指针时将无提示地失败:

size_t size = sizeof array;
size_t number_element = sizeof array / sizeof *array;

Microsoft Visual Studio 2005 有一个名为 _countof 的内置宏或模板 class。它可以正确处理所有情况。另请参阅 MSDN 上的 _countof Macro 文档。

在非微软系统上,我相信你可以使用类似下面的东西。它将正确处理指针(来自 making COUNTOF suck less):

template <typename T, size_t N>
char (&ArraySizeHelper( T (&arr)[N] ))[N];
#define COUNTOF(arr) ( sizeof(ArraySizeHelper(arr)) )

void foo(int primes[]) {
   // compiler error: primes is not an array
   std::cout << COUNTOF(primes) << std::endl;
}

另一个很好的参考是Better array 'countof' implementation with C++ 11。它讨论了错误做事的方法,以及如何在不同的编译器(如 Clang、ICC、GCC 和 MSVC)下正确做事。它包括 Visual Studio 技巧。


buff is an array which can change size during program execution

只要您在编译时有数据,countof 宏或函数就应该可以工作。如果您正在动态构建数据,那么它可能无法正常工作。


这密切相关:Common array length macro for C?。它甚至可能是重复的。