2013-03-06 26 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]);