字符串转换时strtol结果不匹配

时间:2016-05-07 19:33:36

标签: c arrays string hex strtol

在检出this问题后,我没有找到所需的解决方案,因此我尝试以下列方式使用strtol

in = (unsigned char *)malloc(16);

for(size_t i = 0; i < (size_t)strlen(argv[2]) / 2; i+=2 )
{
    long tmp = 0;
    tmp = strtol((const char *)argv[2] + i, &argv[2] + 2, 16);
    memcpy(&in[i], &tmp, 1);
}

此代码生成了几个中间值:

Watches of local variables

有人可以解释一下为什么整个in数组被0xFF(255)个字节填充,为什么tmp不等于它的估计值?

有关如何改进上述代码以使用正确的十六进制值填充in数组的提示也很受欢迎。

1 个答案:

答案 0 :(得分:1)

您的代码在多次计数时都是错误的,并且演员表会隐藏问题:

在C中不需要转换malloc的返回值,如果您忘记包含<stdlib.h>,可能会隐藏不安全的转化:

in = (unsigned char *)malloc(16);

strlen的返回值转换为(size_t)是无用的,甚至是多余的,因为strlen被定义为返回size_t。您可能再次忘记包含<string.h> ...

for (size_t i = 0; i < (size_t)strlen(argv[2]) / 2; i += 2) {
    long tmp = 0;

strtol获取char的const指针,argv[2] + i将隐式转换为(const char*)。演员char*没用。第二个参数是argv的地址。你传递了&argv[4]的第五个元素的地址,换句话说 tmp = strtol((const char *)argv[2] + i, &argv[2] + 2, 16); ,你肯定不是你要做的事情,尽管你的循环的目的非常模糊......

tmp

使用memcpy复制sizeof(tmp)中的长值需要复制char个字节。复制 first 字节仅具有实现定义的效果,具体取决于 memcpy(&in[i], &tmp, 1); } 的大小和目标系统的字节序:

$objPHPExcel->mergeCells('C6:C8')
    ->setCellValue('C6','Production (BBD/Expiry Date')
    ->getStyle()
    ->getAlignment()
    ->setWrapText(true);

您应该发布一个完整的可编译示例来说明您的问题,代码片段缺少重要的上下文信息,例如包含哪些头文件,如何定义变量以及片段之前执行的代码。

正如所写,你的代码没有多大意义,试图解释它的行为毫无意义。

关于参考中的问题,您的代码甚至没有远程提供将十六进制字符串转换为字节数组的解决方案。