【问题标题】:How to insert \x into NSString object如何将 \x 插入 NSString 对象
【发布时间】:2013-03-06 23:54:14
【问题描述】:

我正在尝试将数据打印到蓝牙打印机。为此,我需要将十六进制发送到打印机。我已经通过发送诸如

之类的命令成功地做到了这一点

@"\x1b\x7b\x01" @"\x1b\x7b\x00"

这些都是静态命令。我现在需要获取一些数据,一个 NSString,将其转换为十六进制,然后将其发送到打印机。我尝试了几种不同的方法,其中大部分来自此站点,但无法使其正常工作。

我知道这不起作用,但我想执行以下操作:

for(NSUInteger i = 0; i < [str length]; i++ )
{
    [hexString appendString:[NSString stringWithFormat:@"\x%@",[str characterAtIndex:i]]];
}
    • hexString 是我尝试创建并返回的字符串。 str 是我试图变成十六进制的字符串。例如,11111111 或 abcdefg。

我尝试了各种各样的事情,但都没有运气。

任何帮助将不胜感激!!!

【问题讨论】:

    标签: objective-c io


    【解决方案1】:

    dreamlax 是对的,你应该使用NSData。你可以这样做:

    NSDictionary *hexTable = @{@"0" : @0,
                               @"1" : @1,
                               @"2" : @2,
                               @"3" : @3,
                               @"4" : @4,
                               @"5" : @5,
                               @"6" : @6,
                               @"7" : @7,
                               @"8" : @8,
                               @"9" : @9,
                               @"a" : @10,
                               @"b" : @11,
                               @"c" : @12,
                               @"d" : @13,
                               @"e" : @14,
                               @"f" : @15};
    
    NSMutableData *data = [[NSMutableData alloc] init];
    for(NSUInteger i = 0; i < str.length; i+=2 ) {
        NSString *substring1 = [str substringWithRange:NSMakeRange(i, 1)];
        NSString *substring2 = [str substringWithRange:NSMakeRange(i+1, 1)];
        char valueHigh = [hexTable[substring1] charValue];
        char valueLow = [hexTable[substring2] charValue];
        char result = valueHigh*0x10 + valueLow;
        [data appendBytes:&result length:1];
    }
    

    【讨论】:

    • 这将创建一个包含反斜杠、x 和后跟字符串的字符串,但 OP 的原始代码例如@"\x1b\x7b\x00" 应该只包含三个字节,转义字节(\x1b 或 \033 或 ASCII 代码 27)、命令字节和参数字节(我假设)。我不认为打印机期待这些字节的十六进制表示,我认为它应该是实际字节本身。如果是这种情况,NSString 是使用错误的类。
    • 问题是如何创建像@"\x1b\x7b\x00" 这样的字符串,而不是在这种情况下是否使用NSString
    • 您的解决方案不起作用。它创建等效于@"\\x..." 而不是@"\x..."。字符串不匹配。您的代码将在结果字符串中生成一个实际的反斜杠,而他的字符串 @"\x1B\x7B\x00" 根本没有反斜杠。
    • 你是对的。我误解了这个问题。感谢您指出,我会更新我的答案。
    • 你是绝对正确的,我应该使用 NSData ...只是想通了另一个问题。那么我如何在 NSData 中将 ASCII 字符串转换为十六进制(我说的对)?
    【解决方案2】:

    对于使用“\”,您需要在格式中再转义一个“\”,它应该看起来像这样"\\x%@" 基本上\escape character 在许多语言中使用

    例如,如果您使用

    NSLog(@"\\"); // output is one backslash
    NSLog(@"\\\\"); // output is two backslashes
    

    【讨论】:

      【解决方案3】:

      字符串用于存储文本。如果您想存储任意字节,请改用NSData。特别是,当与外部硬件接口时,我认为一般来说你希望避免使用NSString,尤其是因为字符串总是被假定包含文本,但看起来你的打印机需要二进制数据(你只是 以十六进制表示)。 NUL 字节(\x00\0)不能很好地与 NSString 配合使用,但它们与 NSData 配合得很好。

      const char boldOnBytes[] = { 0x1b, 0x7b, 0x01 };
      NSData *boldOn = [NSData dataWithBytes:boldOnBytes length:sizeof boldOnBytes];
      
      const char boldOffBytes[] = { 0x1b, 0x7b, 0x00 };
      NSData *boldOff = [NSData dataWithBytes:boldOffBytes length:sizeof boldOffBytes];
      

      (我不知道你的实际代码是做什么的)

      要再次获取字节,您可以使用例如:

      // assume you have a function called sendFunction which accepts a handle to the
      // printer, the bytes to send, and a length of how many bytes to send.
      sendFunction(printerHandle, [boldOn bytes], [boldOn length]);
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-12-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-12-10
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多