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::array
、std::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
(包括 size
和 data
)的接口。
使用 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?。它甚至可能是重复的。
我的 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::array
、std::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
(包括 size
和 data
)的接口。
使用 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?。它甚至可能是重复的。