c - 在 char * 中写入和读取整数

标签 c

我正在用 c 编写一个小服务器(聊天服务器),我想在我的 char *data 中写入和读取一个整数(以及其他类型的变量,如短整型、无符号整型 blablabla)。

我有一个结构 DataOutput :

typedef struct t_dataoutput
{
  char *data;
  unsigned int pos;
} DataOutput;

我有一个写 int 的函数:

int writeInt(DataOutput *out, int i)
{
  // here i resize my char *data
  out->data[out->pos] = (i >> 24);
  out->data[out->pos + 1] = (i >> 16) & 0xff;
  out->data[out->pos + 2] = (i >> 8) & 0xff;
  out->data[out->pos + 3] = i & 0xff;
  out->pos += 4;
}

在我的主要函数中,我想尝试我的代码:

int main()
{
  DataOutput out;

  out.writeInt(&out, 9000);
  printf("%d\n", (out.data[0] << 24) | (out.data[1] << 16) | (out.data[2] << 8) | (out.data[3]));
}

但是结果并不好...为什么?我不明白:(

抱歉我的英语不好,我是法国人^^!

感谢您的帮助!

最佳答案

DataOutput.data 应该强制为 unsigned char,因为 char 有时是有符号的,具体取决于编译器,并且移位有符号字符或将它们转换为 int (甚至隐式)将传播符号位:

typedef struct t_dataoutput
{
  unsigned char *data;
  unsigned int pos;
} DataOutput;

out->data 的内存必须在填充之前分配。 您可以在 writeInt 函数中使用 realloc,如下所示:

int writeInt(DataOutput *out, int i)
{
  // here i resize my char *data
  out->data = realloc(out->data, out->pos + 4);
  // TODO: test if out->data == NULL --> not enough memory!
  out->data[out->pos] = (i >> 24) & 0xff;
  out->data[out->pos + 1] = (i >> 16) & 0xff;
  out->data[out->pos + 2] = (i >> 8) & 0xff;
  out->data[out->pos + 3] = i & 0xff;
  out->pos += 4;
}

关于c - 在 char * 中写入和读取整数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29220119/

相关文章:

C "expected expression before ' struct'"错误,因为使用了 typedef 或 header

c - Windows 7 驱动程序 - 仅运行一次然后需要重新启动

c - 在c中使用 mkdir -p 创建文件的父文件夹

c - 树莓派上的结构段错误gcc

ios - Swift - 转换 AutoreleasingUnsafeMutablePointer<AnyObject?> 值

c - 使用优化 (GCC) 时,“while”语句的工作方式不同

c - 是否可以将部分共享二级缓存分配给不同的内核

c - 是否每次都读取数组值作为循环停止条件?

C 中 long double 的转换说明符

c - 如何修改 C 中的二次公式程序,使其在整个程序中只计算一次平方根?