2013-03-06 24 views
0

我试图将数据打印到蓝牙打印机。为了做到这一点,我需要发送十六进制到打印机。我已经通过发送诸如如何将 x插入到NSString对象中

命令已成功这样做@ “\ X1B \ x7b \ X01” @ “\ X1B \ x7b \ X00”

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

我知道这不工作,但我想做到以下几点:

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

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

任何帮助将不胜感激!

回答

3

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]; 
} 
+0

这将创建一个包含反斜杠的字符串,一个X ,后面跟着一个字符串,但OP的原始代码例如'@“\ x1b \ x7b \ x00”'应该只包含三个字节,转义字节(\ x1b或\ 033或ASCII码27),一个命令字节和一个参数字节(我假设)。我不认为打印机正在期待这些字节的十六进制表示,我认为它本身就是实际的字节。如果是这种情况,'NSString'是错误的类。 – dreamlax 2013-03-07 01:07:54

+0

问题是如何创建一个像“@”\ x1b \ x7b \ x00“'这样的字符串,而不是在这种情况下是否使用'NSString'。 – Sebastian 2013-03-07 01:16:03

+0

而您的解决方案不起作用。它创建相当于'@“\\ x ...”'不''“\ x ...”'。字符串不匹配。你的代码会在结果字符串中产生一个实际的反斜杠,而他的字符串'@“\ x1B \ x7B \ x00”'根本没有反斜杠。 – dreamlax 2013-03-07 01:50:49

2

使用“\”你需要逃出一个“\”更在您的格式应该这样看"\\x%@" 基本上\escape character使用在许多语言

例如,如果您使用

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

字符串是用于存储文本。如果要存储任意字节,请改用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]);