0

我想将空字符与常规字符连接起来,如下所示:

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)。如何编辑此代码以便将空字符也附加到字符串中?

回复马克的评论

我在这里尝试做的是将字符串的长度附加到字符串的开头,而不是数字格式,而是 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];

但是,如果有人可以贡献一些更短或更直观的东西,那就太好了。

4

1 回答 1

3

不要这样做。这是个坏主意。例如,NSString 从概念上讲是基于 16 位 Unicode 字符构建的,但您正在尝试添加字节。请注意,不能保证 NSString 的内部表示是 UTF-16 或任何其他特定编码。无论如何,当字符串被写出时,它必须转换为任何编码,这不太可能以您可以预测的方式保留您的长度前缀。

使用长度在前 4 个字节中的 NSData(或者对于 64 位长度,可能 8 个字节会更好),然后是特定编码中的字符串。我推荐 UTF-8。

于 2012-04-08T22:38:33.657 回答