我有一个小资产,想要嵌入字节。我已经取了资产,打印出字节,然后将字节放在一个字节数组中,并将这些字节加载到一个字符串中。看起来像一个字节序问题。我在这里做错了什么?
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!
答案 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)
看起来确实是字节序问题。我会改为使用char
或unichar
数组。
答案 3 :(得分:0)
这实际上不是经典的字节序问题,因为数据是使用“普通”,人类可读的输出打印的(无论如何,它也与字节序相关)。