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)。null 文字も文字列に追加されるように、このコードを編集するにはどうすればよいですか?

マークのコメントへの返信として

ここでやろうとしているのは、文字列の長さを文字列の先頭に追加することです。数値形式ではなく、ASCII 文字の形式 (ほぼ 256 進数のようなもの) で追加します。私はフォーマットを使用します、@"%04c%@",length,message問題は、結果の文字列が になり000¿ABC、ゼロにはASCII値(正確には10進数で48)が含まれるため、目的が無効になることです。10 進値 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 バイト (または 64 ビット長の場合は 8 の方がよい) バイトの長さで NSData を使用し、その後に特定のエンコーディングの文字列を続けます。UTF-8 をお勧めします。

于 2012-04-08T22:38:33.657 に答える