gpt4 book ai didi

objective-c - 包含整数和字符串表示的字节数组

转载 作者:搜寻专家 更新时间:2023-10-30 20:18:59 24 4
gpt4 key购买 nike

我正在为我的 iPhone 制作一个 iOS 套接字客户端。我需要通过 tcp/ip 发送一些字节。一般的想法是,我想将多个值存储在一个字节数组中,以避免多次写入流。举个例子:

uint8_t buffer[1024]; // buffer to hold all data I'm sending

NSString *command = @"Broadcast"; // the actual message i want to send
int length = [command length]; // length of said message

现在,对于缓冲区数组中的前 4 个位置,我想放入长度变量,而从 4 到 13,我想放入实际消息。我知道如何在服务器端解码它,但我不太清楚如何将这些数据放入缓冲区数组,所以我有一个包含我要发送的所有数据的数组。

非常感谢任何帮助!

最佳答案

考虑以下代码:

// 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);

在其他计算机上处​​理此缓冲区时,不要忘记将字节顺序转换回来!

关于objective-c - 包含整数和字符串表示的字节数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18506121/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com