1

我想将整数存储在 char 数组中,例如:0 到 1449,我检查了其他帖子,并尝试了 memset、sprintf 等,但是当我在 char 数组中打印时,我得到乱码或不可读的符号。有人可以帮忙吗?

我检查了重复的链接,但是我没有尝试将 int 打印到 char,我想将 int 存储在 char 数组中。但是我在for循环里面试过buf[i] = static_cast<char>(i);,但没有用。铸造没有奏效。

我尝试的最后一个是这样的: char buf[1450];

for (int i = 0; i < 1449; i++)
{
    memset(buf, ' '+ i, 1450);
    cout << buf[i];
}

输出是:这里

4

2 回答 2

1

我不确定你想做什么!你应该说出你的目标。

c++ 中的 char(通常为 8 位)不包含 int(通常为 32 位),如果要存储 int,则应使用 int 数组:

int buf[1500];

memset(buf, ' '+ i, 1450); 实际上将始终在缓冲区的开头写入 ' ' ascii 数字加上 i 的总和(缓冲区地址永远不会增加)。

像这样的东西,也许是你想要的:

int buf[1500] = 0;
for (int i = 0; i < 1449; i++)
{
    buf[i] = i;
    cout << buf[i] << ' ';
}

考虑使用像 std::vector 这样的 c++11 容器来保存 int 或 chars,使用起来会更安全。

于 2019-09-26T06:54:23.557 回答
1

您将不得不更好地解释您想要什么,因为“将整数存储在 char 数组中”正是这段代码的作用:

char buf[1450];

for (int i = 0; i < 1450; i++)
{
    buf[i] = static_cast<char>(i);
    std::cout << buf[i];
}

是的,输出与您的图片显示的相似,但这也是正确的输出。

当您使用调试器查看buf循环后,它确实包含:0, 1, 2, 3, ..., 126, 127, -128, -127, ..., 0, 1, 2, 3, ...等等,这是预期的内容,因为我们试图将数字 0-1449 放入整数类型(在这种情况下*)可以包含范围 [-128;127]。

如果这不是您正在寻找的行为(听起来好像不是),那么您需要更详细地描述您的要求,否则我们将无法为您提供帮助。

(*) Char 必须能够包含字符代表。在许多/大多数系统上,它是 8 位,但大小取决于系统,也可能更大。


新答案。

感谢您的澄清,我相信您需要的是这样的:

int32_t before = 1093821061; // Int you want to transmit

uint8_t buf[4];
buf[0] = static_cast<uint8_t>((before >> 0) & 0xff);
buf[1] = static_cast<uint8_t>((before >> 8) & 0xff);
buf[2] = static_cast<uint8_t>((before >> 16) & 0xff);
buf[3] = static_cast<uint8_t>((before >> 24) & 0xff);

// Add buf to your UDP packet and send it
// Stuff...
// After receiving the packet on the other end:

int32_t after = 0;
after += buf[0] << 0;
after += buf[1] << 8;
after += buf[2] << 16;
after += buf[3] << 24;

std::cout << before << ", " << after << std::endl;

您的问题(如我所见)是您想在 UDP 数据包所需的 8 位缓冲区中存储 32 位数字。这样做的方法是将较大的数字分开,并将其转换为单独的字节,传输这些字节,然后从字节中再次组装大数字。

上面的代码应该允许你这样做。请注意,我已将类型更改为int32_tuint8_t确保我知道我的类型的确切大小 - 根据您使用的库,您可能必须使用普通intchar类型,请注意,您的类型的确切大小不能保证(很可能它仍然是 32 位和 8 位,但如果更改编译器或针对不同的目标系统进行编译,它们的大小可能会发生变化)。如果您愿意,您可以添加一些sizeof检查以确保您的类型符合您的期望。

于 2019-09-26T06:54:37.337 回答