考虑下面的代码:
// First, we get the C-string (NULL-terminated array of bytes) out of NSString.
const char *cString = [command UTF8String];
// The length of C-string (a number of bytes!) differs terribly from
// NSString length (number of characters! Unicode characters are
// of variable length!).
// So we get actual number of bytes and clamp it to the buffer
// size (so if the command string occasionally gets larger than our
// buffer, it gets truncated).
size_t byteCount = MIN(BUFFER_SIZE - 4,
[command lengthOfBytesUsingEncoding:NSUTF8StringEncoding]);
// Now we're using C type conversion to reinterpret the buffer as a
// pointer to int32_t. The buffer points to some memory, it's up to us
// how to treat it.
*(int32_t *)buffer = byteCount;
// And finally we're copying our string bytes to the rest of the buffer.
memcpy(buffer + 4, cString, byteCount);
有这个代码一个警告 - 它采用主机字节顺序存储uint32_t
变量,因此,如果你通过网络传递这个缓冲区,通常是一个好主意,使你的字节顺序是固定的(网络历史上采用大字节序,尽管大多数计算机现在是小端)。
要解决的字节顺序只需更换线
*(int32_t *)buffer = byteCount;
与
*(int32_t *)buffer = htonl(byteCount);
而且不要忘了字节顺序转换回处理其他计算机上该缓冲区的时候!
看来你的答案对我来说很重要,但是我很难理解它的实际功能。你介意可扩展的例子吗?比如说我想把一个消息的长度附加到缓冲区的末尾,并在那之后追加消息,我该如何去做这件事? –
@ cnh1991我已将评论添加到我的代码中。希望能帮助到你。 – iHunter
@ cnh1991如果您想在缓冲区的最后写入长度,则会执行以下代码:'*(uint32_t *)(buffer + 1020)= byteCount'。它重新解释'buffer + 1020',例如作为指向'uint32_t'的指针,从'buffer'开始的1020个字符。 – iHunter