c - strlen不能返回正确的长度

标签 c strlen

我目前正在使用strlen方法来计算此字符串的长度:

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

主要问题是遇到00时总是停止,我认为这与'\0'混淆了!因此,我想知道是否可以替代此方法,或者您有什么建议可以解决此问题。

附注:我不确定问题是否重复,我搜索了相同的问题,但找不到满意的答案!

编辑:

我的代码:

unsigned char Response[269]={0x00};
unsigned char Response_PPSE[269];


for(i=0;i<=strlen(Response);i++)
sprintf(Response_PPSE+(2*i),"%02X",Response[i]);


strlen只计算此字节的长度:
56 69 56 4F 74 65 63 68 32 00

最佳答案

到目前为止,我看到的其他答案都围绕着这里的实际问题展开。这是您需要了解要处理的字符串类型。

按照历史惯例,C将字符串表示为以空终止的字符数组。这就是strlen期望的字符串。但是您的“字符串”包含空字节。因此,它不是一个以空字符结尾的字符串,strlen不会执行您想要的操作。

更重要的是,strlen极其危险,切勿在现代代码中使用。很容易造成安全漏洞,而且很奇怪,如果您的程序使用strlen检查通过网络接收的响应,则很有可能利用该程序来实现拒绝或服务甚至远程执行代码。

如果指定了正确的大小限制,则更安全的选择是strnlen。正确的解决方案很难更加精确,因为在您的示例中,正确答案始终为269,因此实际上没有可测量的变长字符串。

关于c - strlen不能返回正确的长度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29517418/

相关文章:

预期输入格式的 C Scanf 输入测试

c++ - 为什么将 strlen 重新实现为循环+减法?

c - 在 C 中操作字符串

c - 如何计算C中相同字符的个数?

c - 传递 'strlen' 的参数 1 的符号不同

尝试在 Mac 上确定支持 OpenCL 的设备时出现编译错误

c - OpenBSD下的pthread优先级/调度

c - 如果在同一执行中写入和读取文件,程序将挂起

c - 逆向词,指针法

assembly - 如何在 Assembly 中使用 scasb 查找字符串长度