0

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

字节打印机.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

4 回答 4

4

跳过 NSString 步骤。像这样的问题可能会不断出现,因为您正在与框架对抗 NSString 的使用方式。NSStrings 用于人类可读的文本,而 NSData 用于字节序列。如果您想要一个保持逐字节准确性的任意字节列表,只需使用字节数组和 NSData ——这就是它们的用途。

于 2013-04-17T20:57:20.303 回答
2

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

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

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,,所以你必须在它周围添加括号。

于 2013-04-17T20:54:01.793 回答
0

看起来确实像字节顺序问题。char我会使用or的数组unichar

于 2013-04-17T20:42:43.200 回答
0

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

于 2013-04-17T20:45:11.890 回答