我在互联网上找到了以下代码,它会转换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
函数调用有关,但我不确定是什么。
有人可以解释这是如何以及为何有效吗?
答案 0 :(得分:4)
C样式字符串具有终止零(aka null)字符。以十六进制表示的8位字节的ASCII表示形式将是两个字符加上终结符。
答案 1 :(得分:2)
是的。 strtol期待一个“字符串”。在C字符串中为空终止。因此null的额外字节。
答案 2 :(得分:1)
C字符串必须为NULL(0)终止。由于这是使用具有期望NULL终止字符串的函数的C字符串,因此字符数组必须具有NULL空间。
答案 3 :(得分:0)
C字符串必须以NUL(0)终止。对strtol函数的调用需要。
答案 4 :(得分: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数组的C函数。没有明确使用最后一个空格。 NULL正占据那个地方。