【问题标题】:Convert a 16-bit integer to an array of char? (C++)将 16 位整数转换为 char 数组? (C++)
【发布时间】:2016-04-30 03:43:20
【问题描述】:

我需要将 16 位整数写入文件。 fstream 只写入字符。因此我需要将整数转换为 char - 实际整数,而不是表示整数的字符(即 0 应该是 0x00,而不是 0x30)我尝试了以下操作:

char * chararray = (char*)(&the_int);

然而,这会创建一个由两个字符组成的 backwards 数组。单个字符没有翻转,但字符的顺序是。因此我创建了这个函数:

   char * inttochar(uint16_t input)
{
    int input_size = sizeof(input);
    char * chararray = (char*)(&input);
    char * output;
    output[0]='\0';
    for (int i=0; i<input_size; i++)
    {
        output[i]=chararray[input_size-(i+1)];
    }
    return output;
}

这似乎很慢。肯定有更高效、更简单的方法来转换它吗?

【问题讨论】:

  • 您可以简单地执行f &lt;&lt; i,其中f 是您的ofstreami 是您的整数。如果你想要十六进制而不是你可以做f &lt;&lt; "0x" &lt;&lt; std::hex &lt;&lt; i
  • 我需要将其转换为实际的整数,而不是表示整数的字符。该方法会将整数转换为表示整数的字符。
  • 被选为离题,因为它太琐碎了,不是问题。
  • @Cheersandhth.-Alf OP 想要编写二进制、大端(或者准确地说,与他们机器的本机相反的端)。您的提案将产生文本。
  • 更紧凑一点:char arr[2] = {the_int / 256, the_int % 256}; stream.write(arr, 2);

标签: c++ arrays type-conversion


【解决方案1】:

有点难以理解你在这里问什么(也许只有我一个人,虽然我收集评论员也是这么认为的)。

你写

fstream 只写字符

确实如此,但并不一定意味着您需要显式创建字符数组。

例如,如果你有一个fstream 对象f(以二进制模式打开),你可以使用write 方法:

uint16_t s;
...
f.write(static_cast<const char *>(&s), sizeof(uint16_t));

正如其他人所指出的,当您对数字进行序列化时,使用普遍接受的排序通常是值得的。因此,请使用htons(请参阅您操作系统库的文档):

uint16_t s;
...
const uint16_t ns = htons(s);
f.write(static_cast<const char *>(&ns), sizeof(uint16_t));

【讨论】:

  • 哦,顺便说一下 - 以防其他人有这个问题 - 我认为那里的静态演员表不起作用(至少对我不起作用。)也许应该将其更改为 reinterpret_cast还是只是 (char*)(&ns)?
猜你喜欢
  • 1970-01-01
  • 2011-07-02
  • 1970-01-01
  • 2023-03-28
  • 2017-10-08
  • 1970-01-01
  • 1970-01-01
  • 2016-02-27
  • 2011-08-28
相关资源
最近更新 更多