【问题标题】:Use NSTextfield data to build an array of integers?使用 NSTextfield 数据构建整数数组?
【发布时间】:2012-02-16 23:39:27
【问题描述】:

我使用以下代码将十六进制字符串发送到 NSStream 输出:

uint8_t mirandaroutecommand[] = { 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x30, 0x14 };    
NSData *data = [[NSData alloc] initWithBytes:mirandaroutecommand length:sizeof(mirandaroutecommand)];
[hextooloutputStream write:[data bytes] maxLength:[data length]];

这很好用,但问题是我需要这些十六进制值来自用户界面上的 NSTextfields。我试图将 NSTextfield 数据转换为整数,但没有奏效。有没有办法使用来自多个 NSTextfields 的数据来构建一个使用十六进制值的整数数组?

我试图找到一个涵盖此的现有主题,但我没有运气。

【问题讨论】:

  • 这当然是可能的。您能描述一下将 NSTextfield 数据转换为整数时遇到的问题吗?
  • 当我将其转换为整数时,它不会保留为十六进制值。例如,如果我在我的 NSTextfield 中输入 0x03 然后将其转换为整数,当我显示结果时它是空的。如果我在 NSTextfield 中输入一个数字,例如 4,它会转换为整数并正确显示。显然我不明白如何正确处理十六进制值。
  • 一般来说,您不希望用户必须输入十六进制值,因为大多数用户不理解它们。但如果这是一些技术工具,也许它是可以接受或需要的。如果是这种情况,您可以通过从字符串开头删除“0x”(以及任何空格)从十六进制转换,然后使用类似here 描述的内容。但总的来说,让用户输入格式化数字通常不是一个好主意。您可能会寻找其他方法来获取数据,例如步进器或弹出窗口。
  • 是的,这是用作技术工具的,所以我确实需要将其输入为十六进制。我查看了您链接到的示例,并尝试了代码。它正在转换十六进制,但我不想转换它。我想将输入的数据用作十六进制而不是其他一些基础。有什么想法吗?
  • 如果您使用 strtol,如上所述,它返回的结果 int 将是您想要的值。

标签: arrays cocoa hex


【解决方案1】:

NSString 方法 integerValueintValue 采用十进制表示并忽略和尾随 gumph - 所以将它们应用于 @"0x01" 并且他们会看到 0 后跟一些他们忽略的 gumph (x01) .

要读取十六进制值,请使用NSScannerscanHexInt:(或scanHexLongLong:):

unsigned scannedHexValue;
if ([[NSScanner scannerWithString:textFieldContents] scanHexInt:&scannedHexValue])
{
   // value found
   ...
}

NSScanner 比仅解析单个值更强大,因此如果您愿意,可以通过适当的方法调用扫描逗号分隔的十六进制值列表。

【讨论】: