【问题标题】:Why does this code have an array of 3 bytes to build a "whole byte"?为什么这段代码有一个 3 个字节的数组来构建一个“整个字节”?
【发布时间】:2013-01-27 05:46:15
【问题描述】:

我在互联网上找到了以下代码,它将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 函数调用有关,但我不确定是什么。

有人能解释一下它的工作原理和原因吗?

【问题讨论】:

  • 我看不出这段代码如何将@"00 F0 41 00 00 27 12"转换为字节序列00f04100002712...似乎假设输入没有分隔符。
  • 在将它传递给这个函数之前,我会去掉所有的空格,就是这样。带空格的版本便于阅读和调试。

标签: objective-c c strtol


【解决方案1】:

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

【讨论】:

  • 我已经在语言的土地上花费了太多的时间和适当的String 对象;距离C 太久了!
【解决方案2】:

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

【讨论】:

    【解决方案3】:

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

    【讨论】:

    • NULL(全部大写)在 C 中的含义有所不同。它是空指针 - 您在这里以一种可能令人困惑的方式重载了含义。
    【解决方案4】:

    C 字符串必须以 NUL (0) 结尾。对 strtol 函数的调用需要这样。

    【讨论】:

      【解决方案5】:

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

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

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-08-30
        • 1970-01-01
        • 2021-03-14
        • 2020-06-03
        • 1970-01-01
        • 2011-11-29
        • 2019-10-24
        • 2011-01-24
        相关资源
        最近更新 更多