在char *中写入和读取整数

时间:2015-03-23 20:51:04

标签: c

我在c(聊天服务器)编写一个小服务器,我想在我的char *数据中编写和读取整数(以及其他类型的变量,如short int,unsigned int 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]));
}

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

抱歉我的英语我是法语^^!

谢谢你的帮助!

2 个答案:

答案 0 :(得分:0)

当然我用这个函数初始化我的结构:

void initDataOutput(DataOutput *out)
{
  out->data = NULL;
  out->pos = 0;
}

但我无法做到:

DataOutput out;
char tmp[4];
out.data = tmp;
out.pos = 0;

因为在我的代码中,我可以编写类似的东西,例如:

DataOutput out;
writeInt(&out, 1);
writeString(&out, "Hello");
sendData(&out);

其中int是一种数据包ID和&#34; Hello&#34;是连接消息,但如果它是另一个ID,则它与out-&gt; data中的信息不同

对不起,当你说:避免改变签名的整数和字符时,我不明白你的意思

我必须在DataOutput结构中使用unsigned char *数据吗?

答案 1 :(得分:0)

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

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

out-&gt;数据的内存必须在填充之前分配。 您可以在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;
}