NSString字节硬编码

时间:2013-04-17 20:39:17

标签: objective-c

我有一个小资产,想要嵌入字节。我已经取了资产,打印出字节,然后将字节放在一个字节数组中,并将这些字节加载到一个字符串中。看起来像一个字节序问题。我在这里做错了什么?

BytePrinter.app

 const char *helloworldc = "Hello, World!";
 NSString *helloworld = [NSString stringWithUTF8String:helloworldc];
 NSData *data = [helloworld dataUsingEncoding:NSUTF8StringEncoding];
 NSLog(@"%@", [data description]);

输出:

<48656c6c 6f2c2057 6f726c64 21>

ByteImporter.App

  const uint32_t bytes[] = {0x48656c6c, 0x6f2c2057, 0x6f726c64, 0x21};
  NSString *helloworld = [[NSString alloc] initWithBytes:bytes
                                                  length:sizeof(bytes)
                                                encoding:NSUTF8StringEncoding];
  NSLog(@"%@", helloworld);

输出:

lleHW ,odlro!

4 个答案:

答案 0 :(得分:4)

跳过NSString步骤。像这样的问题可能会继续出现,因为你正在打算如何使用NSString的框架。 NSStrings用于人类可读的文本,而NSData用于字节序列。如果你想要一个保持逐字节精度的任意字节列表,只需要使用字节数组和NSData - 这就是它们的用途。

答案 1 :(得分:2)

[data descriptions]返回按字节分组的每字节输出。

如果您想对字符串进行硬编码,请使用以下代码:

const unsigned char bytes[] = {0x48, 0x65, 0x6c, 0x6c, 0x6f, 0x2c, 0x20, 0x57, 0x6f, 0x72, 0x6c, 0x64, 0x21};
NSString *helloworld2 = [[NSString alloc] initWithBytes:bytes
                                                length:sizeof(bytes)
                                              encoding:NSUTF8StringEncoding];
NSLog(@"%@", helloworld2);

我的代码返回正确的字符串

如果你想优化某些东西(问题:什么?)你必须关心字节顺序并相应地纠正你的uint32_t数组

<强>更新 有一个代码可以通过NSData生成所需的硬编码数组:

const char *helloworldc = "Hello, World!";
NSString *helloworld = [NSString stringWithUTF8String:helloworldc];
NSData *data = [helloworld dataUsingEncoding:NSUTF8StringEncoding];

NSMutableString *outStr = [[NSMutableString alloc] init];

unsigned char *ubytes = (unsigned char*)[data bytes];

for (int i = 0; i < [data length]; i++) {
    [outStr appendFormat: @"0x%02x, ", ubytes[i]];
}

NSLog(@"%@", outStr);

在输出时,你会得到这样的字符串:0x48, 0x65, 0x6c, 0x6c, 0x6f, 0x2c, 0x20, 0x57, 0x6f, 0x72, 0x6c, 0x64, 0x21,,所以你必须在它周围添加护腕。

答案 2 :(得分:0)

看起来确实是字节序问题。我会改为使用charunichar数组。

答案 3 :(得分:0)

这实际上不是经典的字节序问题,因为数据是使用“普通”,人类可读的输出打印的(无论如何,它也与字节序相关)。