【问题标题】:C++: getting a fact size of data in uchar/guchar?C++:在 uchar/guchar 中获取数据的实际大小?
【发布时间】:2010-11-15 02:18:41
【问题描述】:
问题很简单:sizeof((u_char)value) 返回 8。strlen 失败。如何获取uchar的内容长度?
尝试过
std::cout << "Data: " << (u_char *)data[0] << "\n"`;
u_char 在 include/sys/*.h 中定义为 unsigned char;
【问题讨论】:
标签:
c++
sizeof
strlen
unsigned-char
【解决方案1】:
sizeof() 返回存储变量所需的字节数。所以 sizeof(u_char) == 8 表示存储一个 u_char 需要 8 个字节。
您遇到分段错误的原因是因为 (u_char *)data[0] 意味着您想要数据数组中的第一个元素,然后将其视为内存地址并将数据转储到那里。因此,如果 data[0] 为 60,则您正在尝试 std::cout 内存位置 60 处的任何内容。由于此内存位置属于另一个应用程序,您会遇到分段错误(您正在查看允许的内存段之外。)
在不知道u_char是什么数据类型的情况下,无法说出如何得到它的长度。
【解决方案2】:
问题很简单:
sizeof((u_char)value) 返回 8。
strlen 失败。如何获得长度
uchar 的内容?
我感觉u_char 是unsigned char 而value 被定义为u_char value[8]
因此,对我来说,您似乎正在尝试提取非 NULL 终止的缓冲区的长度。这就是 strlen 失败的地方。
以下是一些基础知识:
给定代码
unsigned char buf[2] = {'H', 'I'}; // not NULL terminated.
一个。 strlen(buf) 将给出未定义的结果,因为缓冲区“buf”中没有终止 NULL。
b. sizeof(buf[0]) 在任何实现中都会给出 1
c。 sizeof(buf) 将给出 2,这是为 buf 保留的内存大小。
如果缓冲区不用于表示字符串(始终以 NULL 结尾),而只是可能被某个标记/哨兵终止的字节序列,在这种情况下,需要通过计数来计算缓冲区的长度手动标记前的元素数量(for/while/do-while 循环等)。
顺便说一句,为什么不使用 std::vector 或 std::string?
【解决方案3】:
如果 data[0] 是一个标量值(例如,不是指针,尤其是指向 ASCII 或 UTF-8 文本字符串的指针),那么是的,这很可能会出现段错误。在这种情况下,您所做的是获取 data[0] 的值并告诉编译器将其视为指针。
例如,假设您有以下内容:
char data[256];
strcpy(data, "Hello");
std::cout << "Data: " << (u_char *)data[0] << "\n"`;
data[0] 处的值是字符“H”,其值为 72(基数为 10)。因此,您刚刚告诉编译器将 72 视为指针,并在地址 72 处找到一个字符串,然后将其打印出来。这不太可能奏效。
一些操作系统专门保护低地址,并在您尝试访问它们时故意进行分段错误,以让您知道您已经编写了此类错误。
【解决方案4】:
(sizeof(value)/sizeof(value[0])) * sizeof(u_char)