我在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]));
}
但结果并不好......为什么?我不明白:(
抱歉我的英语我是法语^^!
谢谢你的帮助!
答案 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;
}