我正在用 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/