unsigned char Response[269]={0x00};
Это инициализирует Response
последовательностью из 269 идентичных значений, каждое из которых равно нулю. Обратите внимание, что 0x00
, 0
и '\0'
— это одно и то же.
strlen(Response)
На самом деле это недопустимо, хотя некоторые компиляторы могут это разрешать. strlen
требует аргумента типа char*
; Response
— это массив unsigned char
, который преобразуется в указатель типа unsigned char*
. Типы несовместимы, неявное преобразование отсутствует. Вы должны были получить предупреждение во время компиляции (если да, включите предупреждение в свой вопрос).
Если мы изменим определение Response
на:
char Response[269] = {0x00};
тогда вызов strlen
становится действительным и возвращает 0
. strlen
ищет первый '\0'
нулевой символ, и вы заполнили Response
нулевыми символами.
В верхней части вашего вопроса вы говорите, что у вас есть строка:
56 69 56 4F 74 65 63 68 32 00 2C 00 00 27 6F 23 84 0E 32 50 41 59 2E 53 59 53 2E 44 44 46 30 31 A5 11 BF 0C 0E 61 0C 4F 07 A0 00 00 00 04 10 10 87 01 01
Это не имеет ничего общего с кодом, который вы нам показали. Это также неоднозначно; это строка шестнадцатеричных цифр и пробелов: "56 69 56 ..."
или что-то вроде "\x56\x69\x56..."
? Если последовательность 56 69
предназначена для представления содержимого вашего массива, обновите свой вопрос, чтобы показать фактический код, который его создает.
Ну наконец то:
for(i=0;i<=strlen(Response);i++)
sprintf(Response_PPSE+(2*i),"%02X",Response[i]);
Вызов strlen
на каждой итерации цикла может быть весьма неэффективным. strlen
должен каждый раз сканировать всю строку, чтобы определить ее длину. Как только вы устраните другие проблемы, вы должны вызвать strlen
один раз перед циклом и использовать сохраненное значение.
Однако вы, вероятно, не хотите использовать strlen
в первую очередь. strlen
применяется к строкам. «Строка» — это последовательность символов, заканчивающаяся нулевым символом (0
, '\0'
, 0x00
). Похоже, у вас есть последовательность символов без знака, в которой 0x00
является допустимым значением, а не терминатором. Вместо того, чтобы использовать strlen
для вычисления длины массива, вам нужно отслеживать длину каким-то другим способом.
person
Keith Thompson
schedule
08.04.2015
0
и'0'
— это не одно и то же. - person Sourav Ghosh   schedule 08.04.2015"56 69 56 4F 74 ..."
) или это массивchar
со значениями0
? - person crashmstr   schedule 08.04.2015'\0'
! Нет путаницы. Это одно и то же, символ ASCII 0. - person Paul Roub   schedule 08.04.2015strlen()
и что длина строки означает в C), как вы ожидаете узнать, когда вы достигли конец строки? - person Paul Roub   schedule 08.04.2015char a[] = "56 69 5........"; printf("%d",strlen(a));
- person Arun A S   schedule 08.04.2015strlen()
ведет себя именно так, как ожидалось. Вы так и не сказали, как хотите определять конец строки. - person Paul Roub   schedule 08.04.2015unsigned char Response[269]={0x00};
: все элементы равны нулю. - person BLUEPIXY   schedule 08.04.2015