C ++ unsigned char数组长度

时间:2016-12-29 09:04:08

标签: c++ linux uart

我的C ++程序中有十六进制值的unsigned char数组:

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

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

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

因为我可以看到长度是int数,buff是一个可以在程序执行期间改变大小的数组。 任何人都可以帮助我如何写它。感谢

4 个答案:

答案 0 :(得分:5)

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

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);

答案 1 :(得分:2)

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

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

为固定数组提供了std::vector(包括size&amp; data)等界面。 使用array可能会阻止某些常见错误,并提供<algorithm>所涵盖的某些功能。

write的调用将是:

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

答案 2 :(得分:1)

您可以使用数组执行此操作:

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");
}

答案 3 :(得分:0)

  

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

您需要COUNTOF宏或功能。在所有情况下,他们都很难做到。例如,使用指针时,下面显示的接受答案将无声地失败:

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

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

在非Microsoft系统上,我相信您可以使用以下内容。它将正确处理指针(来自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是一个可以在程序执行期间改变大小的数组

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

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