使用 NSASCIIStringEncoding 缩短 NSString 编码

Posted

技术标签:

【中文标题】使用 NSASCIIStringEncoding 缩短 NSString 编码【英文标题】:Encoding NSString cut short using NSASCIIStringEncoding 【发布时间】:2017-05-18 18:50:26 【问题描述】:

我有这个:

<53657269 616c3a20 39303030 30303138 3b4d6f64 656c3a20 32323031 3b466972 6d776172 653a2030 3431353b 4c696272 6172793a 20535444 30363132 3b566f69 63653a20 4d31303b 546f7765 723a2059 65733b52 65636f72 643a2059 65733b44 69616c3a 204e6f3b 554f7074 733a2031 39383b46 756e6374 696f6e73 3a205245 44411034 424c5545 1011546f 6c6c0118 48796d6e a003466e 63351066 666f6f64 10556261 636f0000 746f6173 10253b4c 6162656c 733a2042 4c554542 4c554523 466e6338 544f4153 54455223 466e6337 4241434f 4e23466e 63354c41 50544f50 53235245 44415445 58415323 466e6336 42524943 4b532374 6f617354 4f415354 45522362 61636f42 41434f4e 23666f6f 64424143 4f4e3b4d 696c5665 723a2035 2e302e36 2e313b4c 6f67696e 3a205965 73>

我正在使用它来转换为 NSString:

NSString *info = [[NSString alloc] initWithData:data encoding:NSASCIIStringEncoding];

我的输出是:

  Serial: 90000018;Model: 2201;Firmware: 0415;Library: STD0612;Voice: M10;Tower: Yes;Record: Yes;Dial: No;UOpts: 198;Functions: REDA4BLUETollHymn Fnc5ffoodUbaco

如果你转换整个集合,你得到的比字符串中显示的要多得多。为什么它在编码中缩短它?

使用现成的在线编码器快速转换,您可以获得完整的转换:

Serial: 90000018;Model: 2201;Firmware: 0415;Library: STD0612;Voice: M10;Tower: Yes;Record: Yes;Dial: No;UOpts: 198;Functions: REDA4BLUETollHymn Fnc5ffoodUbacotoas%;Labels: BLUEBLUE#Fnc8TOASTER#Fnc7BACON#Fnc5LAPTOPS#REDATEXAS#Fnc6BRICKS#toasTOASTER#bacoBACON#foodBACON;MilVer: 5.0.6.1;Login: Yes

为什么是 NSString *info = [[NSString alloc] initWithData:data encoding:NSASCIIStringEncoding];只写了一半的字符串?

【问题讨论】:

【参考方案1】:

我怀疑它正在转换整个字符串,但是您用来检查它的机制正在截断它。看起来您的 ASCII 编码数据中嵌入了空字符。 NSString 完全能够保存嵌入的空字符,但任何转换为​​ C 样式字符串的内容都会在遇到其中一个字符后停止处理。

如果您使用以下方法对字符串进行后处理,您会得到什么?

unichar nullUnichar = 0;
NSString* nullCharString = [[NSString alloc] initWithCharacters:&nullUnichar length:1];
info = [info stringByReplacingOccurrencesOfString:nullCharString withString:@"\\x00"];

【讨论】:

要么,要么尝试NSUTF8StringEncodingedit 实际上,这可能也行不通...需要删除空字符,而且看起来数据有几个“控制字符”——0x10、0x11 等——这可能放弃转换。 @DonMag:这仍然会在字符串中嵌入空字符,并且对其进行 C-sting 样式处理的任何内容都会停在那里。 @KenThomases 您的解决方案有效。过滤和替换空字符允许它打印到完整的字符串。谢谢! @KenThomases 只是好奇。如何识别数据中有空字符。我在用于测试的解码器中看不到这一点。 @johnsonjp34 - 通过快速眼睛扫描,数据至少包含636f0000,那里有两个空值。

以上是关于使用 NSASCIIStringEncoding 缩短 NSString 编码的主要内容,如果未能解决你的问题,请参考以下文章

解析NSString数据-获取空值

转字符编码笔记:ASCII,Unicode和UTF-8

iOS调用系统电话浏览器地图邮件等

ios 中怎样将汉字转成nsdata

NSData类型转换成NSString类型

测试使用