C ++: получение фактического размера данных в uchar / guchar? - PullRequest
0 голосов
/ 15 ноября 2010

Проблема проста: sizeof((u_char)value) возвращает 8. strlen терпит неудачу. Как узнать длину содержимого uchar?

Покушение

std::cout << "Data: " << (u_char *)data[0] << "\n"`;

u_char определен в include / sys / *. H как неподписанный символ;

Ответы [ 4 ]

1 голос
/ 15 ноября 2010

sizeof () возвращает количество байтов, необходимое для хранения переменной.Поэтому sizeof (u_char) == 8 означает, что для хранения одного u_char требуется восемь байтов.

Причина, по которой вы получаете ошибку сегментации, заключается в том, что (u_char *) data [0] означает, что вы хотите первый элемент вмассив данных, затем обрабатывайте его как адрес памяти и сохраняйте там данные.Поэтому, если data [0] равно 60, вы пытаетесь выполнить std :: cout для того, что находится в ячейке памяти 60. Поскольку эта ячейка памяти принадлежит другому приложению, вы получаете ошибку сегментации (вы смотрите за пределами вашего разрешенного сегмента памяти.)

Не зная, что такое тип данных u_char, невозможно сказать, как получить его длину.

1 голос
/ 15 ноября 2010

Проблема проста: значение sizeof ((u_char)) возвращает 8. Ошибка strlen.Как узнать длину содержимого uchar?

У меня такое ощущение, что u_char - это unsigned char, а value определяется как u_char value[8] Так что, мне кажется, выпопытка извлечь длину буфера, который не является NULL, завершен.Вот где strlen терпит неудачу.

Вот некоторые основы:

Учитывая код

unsigned char buf[2] = {'H', 'I'}; // not NULL terminated.

a.strlen (buf) даст неопределенные результаты, поскольку в буфере 'buf' нет завершающего NULL.

б.sizeof (buf [0]) даст 1 для любой реализации

c.sizeof (buf) даст 2, то есть размер памяти, зарезервированной для buf. * ​​1020 *

Если буфер не используется для представления строк (которые всегда заканчиваются на NULL), но это просто последовательность байтов, потенциально завершаемыхнекоторый маркер / страж, в таком случае, длина буфера должна быть рассчитана путем подсчета количества элементов перед стражем вручную (для цикла / while / do-while и т. д.).

Кстати, почемуне использовать std :: vector или std :: string?

0 голосов
/ 15 ноября 2010
(sizeof(value)/sizeof(value[0])) * sizeof(u_char)
0 голосов
/ 15 ноября 2010

Если data [0] является скалярным значением (например, не указателем, особенно на текстовую строку ASCII или UTF-8), то да, это, скорее всего, вызовет ошибку сбоя. В этом случае вы берете значение в data [0] и говорите компилятору обрабатывать его как указатель.

Итак, допустим, у вас есть следующее:

char data[256];
strcpy(data, "Hello");
std::cout << "Data: " << (u_char *)data[0] << "\n"`;

Значением в данных [0] является символ «H», значение которого равно 72 (основание 10). Итак, вы только что сказали компилятору обрабатывать 72 как указатель, найти строку по адресу 72 и распечатать ее. Это вряд ли сработает.

Некоторые операционные системы специально защищают низкие адреса и преднамеренно фиксируют ошибки, когда вы пытаетесь получить к ним доступ, чтобы вы знали, что вы написали этот тип ошибки.

...