【问题标题】:How do I add an NSString to NSMutableData?如何将 NSString 添加到 NSMutableData?
【发布时间】:2017-05-22 06:08:28
【问题描述】:

我不知道如何将我的 NSString 添加到 NSMutableData 结构中

这是我想要实现的,下面是硬编码并且可以工作,你可以看到数字字符串是我想要用我拥有的辅助函数中的动态数据替换的。

NSMutableData *commands = [NSMutableData data];

[commands appendBytes:"\x1b\x62\x06\x02\x02\x20" "09258384394951\x1e\r\n" length:sizeof("\x1b\x62\x06\x02\x02\x20" "09258384394951\x1e\r\n") - 1];

我尝试构建一个 NSString 来完全模仿上述内容,如下所示

NSString *trNo = [NSString stringWithFormat:@"\"\x1b\x62\x06\x02\x02\x20\" \"%@\x1e\r\n\"", [NWTillHelper getCurrentOrderNumber]];

但这不能添加到 NSMutableData 构造中,我尝试如下

[commands appendBytes:(__bridge const void * _Nonnull)(trNo) length:sizeof("\x1b\x62\x06\x02\x02\x20" "09258384394951\x1e\r\n") - 1];

如何创建一个 appendBytes 构造,以便将我的 NSString 插入其中并使其成为动态的?

----进一步澄清-----

我正在使用 NSData 结构发送到打印机

例如下面是剪切标签的代码

 // Cut the paper
    [commands appendBytes:"\x1b\x64\x02" length:sizeof("\x1b\x64\x02") - 1];

这是使文本居中对齐的命令

// Alignment (Center)
    [commands appendBytes:"\x1b\x1d\x61\x01" length:sizeof("\x1b\x1d\x61\x01") - 1];

如您所见,这些是普通的十六进制命令,它们可以正常工作

我遇到的问题是打印条形码的命令在所有 HEX 代码的中间包含一个动态字符串,我无法弄清楚如何将 NSString 放入这个 HEX 代码的中间。

这是打印条码的命令,其中条码包含数字 09258384394951,您可以在下面看到这些是硬编码的。此代码工作正常,打印机可以正确打印条形码,但问题是我无法对数字/字符 09258384394951 进行硬编码,我需要将其作为某种变量,这就是我卡住的地方。

[commands appendBytes:"\x1b\x62\x06\x02\x02\x20" "09258384394951\x1e\r\n" length:sizeof("\x1b\x62\x06\x02\x02\x20" "09258384394951\x1e\r\n") - 1];

【问题讨论】:

  • 您可以先尝试将字符串转换为字节。 NSData *strByte = [trNo dataUsingEncoding:NSUTF8StringEncoding];
  • 不起作用,但打印三重奏,显示以下内容,也许我没有逃跑吧? trNo="b""1-20170522141541
  • 尝试转义更多但仍然不起作用 NSString *trNo = [NSString stringWithFormat:@"\"\\x1b\\x62\\x06\\x02\\x02\\x20\\ \" \"%@\\x1e\\r\\n\\\"", [NWTillHelper getCurrentOrderNumber]];
  • @GeneCode:在这种情况下,UTF-8 是一个非常糟糕的解决方案,因为马特总是在他的字符串中插入字节。如果他插入一个大于 127 的字节,他将得到一个多字节序列。 NSISOLatin1StringEncoding 应该是更好的选择。
  • NSString *trNo = [NSString stringWithFormat:@"\"\\x1b\\x62\\x06\\x02\\x02\\x20\\\" \"%@\\x1e\ \r\\n\\\"", [NWTillHelper getCurrentOrderNumber]]; NSData *strByte = [trNo dataUsingEncoding:NSISOLatin1StringEncoding];还是不行

标签: objective-c nsmutabledata


【解决方案1】:

分三步添加数据:

NSMutableData *commands = [NSMutableData data];
NSData *orderNumber = [@"09258384394951" dataUsingEncoding:NSUTF8StringEncoding];  // example of order number converted to NSData
[commands appendBytes:"\x1b\x62\x06\x02\x02\x20" "" length:sizeof("\x1b\x62\x06\x02\x02\x20" "") - 1];  
[commands appendData:orderNumber];  
[commands appendBytes:"\x1e\r\n" length:sizeof("\x1e\r\n") - 1];    

【讨论】:

    【解决方案2】:

    你可以从NSString得到NSData

    NSData *dataString = [yourString dataUsingEncoding: NSUTF8StringEncoding];
    

    使用适合您情况的编码。将获取的数据追加到现有的NSMutableData

    NSMutableData *commands = [data mutableCopy];
    

    【讨论】:

      【解决方案3】:

      试试这个:

      [commands appendData:[trNo dataUsingEncoding:NSUTF8StringEncoding]];
      

      【讨论】:

      • 这会打印实际的字符串,我猜打印机需要字节转换的数据?这不就是 appendBytes 的作用吗?
      • 哦,你是不是想将十六进制字符串打印到 nsdata 中?
      • 是的,我正在尝试创建一个 nsdata 字符串,该字符串看起来与我的问题中的字符串完全相同,但该字符串是硬编码的,我只是希望能够使其动态
      • 所以你基本上想将“十六进制”代码直接输入到nsmutabledata中?所以当你在文件上使用“hexdump”之类的东西时,它会显示相同的十六进制字符串吗?有点?
      • 我想这样做,[命令 appendBytes:"\x1b\x62\x06\x02\x02\x20" "09258384394951\x1e\r\n" length:sizeof("\x1b\ x62\x06\x02\x02\x20" "09258384394951\x1e\r\n") - 1];但是将 09258384394951 更改为变量
      猜你喜欢
      • 2019-04-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-10
      • 2010-10-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多