1

我在互联网上找到了以下代码,它将NSString表示形式
@"00F04100002712"转换为实际的字节数组。该代码有效并且确实生成了正确的输出;我只是不明白为什么有char byte_chars[3]而不是char byte_chars[2]因为代码中只使用了前两个位置。

void hexStringToBytes(NSString *s, NSMutableData *data)
{
    unsigned char whole_byte;
    char byte_chars[3] = {'\0','\0','\0'};
    int commandLength = (int)[s length];

    // convert hex values to bytes
    for (int i=0; i < commandLength/2; i++)
    {
        byte_chars[0] = [s characterAtIndex:i*2];
        byte_chars[1] = [s characterAtIndex:i*2+1];
        whole_byte = strtol(byte_chars, NULL, 16);
        [data appendBytes:&whole_byte length:1];
    }
}

我认为这与strtol函数调用有关,但我不确定是什么。

有人可以解释这是如何以及为什么起作用的吗?

4

5 回答 5

4

C 风格的字符串有一个终止零(又名空)字符。以十六进制表示的 8 位字节的 ASCII 表示将是两个字符加上该终止符。

于 2013-01-27T05:48:41.223 回答
2

是的,它确实。strtol 需要一个“字符串”。在 C 中,字符串以 null 结尾。因此空值的额外字节。

于 2013-01-27T05:48:53.357 回答
1

C 字符串必须以 NULL (0) 结尾。由于这是使用带有函数的 C 字符串,该函数需要以 NULL 结尾的字符串,因此字符数组必须为 NULL 留出空间。

于 2013-01-27T05:48:54.623 回答
0

C 字符串必须以 NUL (0) 终止。对 strtol 函数的调用期望如此。

于 2013-01-27T05:51:56.083 回答
0

你搞砸了 C、C++ 和 Objective-C。

C++ 和 Obj-c 充分利用了数组。C++ 为 NULL ('\0') 创建一个大小为 + 额外 1 个空间的数组。Obj-c 的 NSString 类只是一个指针,因此不需要 NULL。

在 C 中,您需要以 NULL ('\0) 来终止字符数组,并使用分配的大小中的最后一个空间。因此,如果您编写char str[10];,那么您可以使用 9 个字符,最后一个字符会自动设为 NULL。

在您使用 strtol 的代码片段中,这是一个需要 C-char-array 的 C 函数。最后一个空间没有明确使用。NULL 占据了那个位置。

于 2013-01-27T06:16:07.343 回答