【问题标题】:Converting C unsigned char array with null-terminating char in middle to Objective-C NSString将中间带有空终止字符的 C 无符号字符数组转换为 Objective-C NSString
【发布时间】:2017-06-20 14:11:13
【问题描述】:

在 iOS 应用中,我使用的是用 C 编写的第 3 方 SDK。 作为 SDK 方法调用的结果,我收到了一个 unsigned char 数组(参见下面的示例)。

我需要将此数组转换为 Objective-C 字符串 (NSString) 以保存它,然后再将其转换回 C 以将其作为参数传递给另一个 SDK 方法。


我见过多种将 C 字符串转换为 Objective-C 的方法。

NSString *example1 = [NSString stringWithFormat:@"%s", myArray]; // "8oFDO{c."rägÕªö"
NSString *example2 = [[NSString alloc] initWithBytes:myArray length:sizeof(myArray) encoding:NSASCIIStringEncoding]; // "8oFDO{c."rägÕªö"
...

但它们似乎都不允许\0(空终止字符)出现在中间(参见下面示例中的 [29])。


无符号字符数组响应示例:

{
  [0] = '8'
  [1] = '\b'
  [2] = '\x01'
  [3] = 'o'
  [4] = '\x01'
  [5] = '\x03'
  [6] = 'F'
  [7] = 'D'
  [8] = 'O'
  [9] = '\x02'
  [10] = '\x10'
  [11] = '\x0e'
  [12] = '{'
  [13] = '\x8d'
  [14] = 'c'
  [15] = '.'
  [16] = '\x19'
  [17] = '"'
  [18] = 'r'
  [19] = '\xe4'
  [20] = 'g'
  [21] = '\x18'
  [22] = '\xd5'
  [23] = '\xaa'
  [24] = '\xf6'
  [25] = '\x95'
  [26] = '\x18'
  [27] = '\x03'
  [28] = '\x01'
  [29] = '\0'
  [30] = '\x04'
  [31] = '\x01'
  [32] = '\x05'
  [33] = '\x05'
  [34] = '\x01'
  [35] = '\x05'
  [36] = '\x06'
  [37] = '\x01'
  [38] = '\x01'
  ...
}

如何从 C 转换到 Objective-C,然后再从 Objective-C 转换回 C?

【问题讨论】:

  • stackoverflow.com/questions/3949628/… ?但是你会忘记byte[29] 有一个\0 的事实(如果你想把它转换回来),所以只保存字节数组?
  • 我看到了其他解决方案,例如 stackoverflow.com/a/6093939/1197572\0 替换为 \\0
  • 这个unsigned char 数组根本不是一个字符串。您应该将其视为void * 并使用 NSData 来存储此类参数。
  • @AndrewTomenko 您可能会遇到一些问题,通过将其存储到 NSData 并将其转换回无符号字符数组,我得到的结果与有希望的初始值相同。我今天无法进一步测试,但我明天会这样做并报告结果。谢谢:-)
  • @AndrewTomenko 让它工作。感谢您的洞察力!

标签: ios objective-c c null-terminated


【解决方案1】:

这个unsigned char 数组根本不是字符串。您应该将其视为void * 并使用NSData 来存储此类参数。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-17
    • 2018-09-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多