我想将空字符与常规字符连接起来,如下所示:
NSString *message = @"ABC";
NSUInteger length = [message length];
char char4 = length;
char char3 = length >> 8;
char char2 = length >> 16;
char char1 = length >> 24;
message = [NSString stringWithFormat:@"%c%c%c%c%@",char4,char3,char2,char1,message];
问题是字符串长度为4(看起来像¿ABC
)。如何编辑此代码,以便将空字符也附加到字符串?
回复Mark的评论
我在这里尝试做的是将字符串的长度附加到字符串的开头,而不是数字格式,但是格式为ascii字符(几乎像基数256的数字)。我会使用格式@"%04c%@",length,message
,问题是结果字符串将是000¿ABC
并且零具有ascii值(精确到十进制48)并且因此失败了目的。具有十进制值0的ASCII字符是空字符(\0
)所以我必须使用它而不是0.我必须使用那些前导空字符。
出于我想要完成的目的,以下代码可以正常工作
NSUInteger length = [message length];
char char4 = length;
char char3 = length >> 8;
char char2 = length >> 16;
char char1 = length >> 24;
if (char4 == '\0')
message = [NSString stringWithFormat:@"\0%@",message];
else
message = [NSString stringWithFormat:@"%c%@",char4,message];
if (char3 == '\0')
message = [NSString stringWithFormat:@"\0%@",message];
else
message = [NSString stringWithFormat:@"%c%@",char3,message];
if (char2 == '\0')
message = [NSString stringWithFormat:@"\0%@",message];
else
message = [NSString stringWithFormat:@"%c%@",char2,message];
if (char1 == '\0')
message = [NSString stringWithFormat:@"\0%@",message];
else
message = [NSString stringWithFormat:@"%c%@",char1,message];
但是,如果任何人可以提供更短或更直观的东西,那就太棒了。
答案 0 :(得分:3)
不要这样做。这是个坏主意。例如,NSString在概念上是基于16位Unicode字符构建的,但您尝试在字节前添加前缀。请注意,没有任何保证NSString的内部表示是UTF-16或任何其他特定编码。在任何情况下,当写出字符串时,必须将其转换为任何编码,并且不太可能以您可以预测的方式保留长度前缀。
使用前4个长度的NSData(或者对于64位长度可能更好8个)字节,后跟特定编码中的字符串 。我推荐使用UTF-8。