我试图将两个整数值存储到C ++中的char数组中。 这是代码..
char data[20];
*data = static_cast <char> (time_delay); //time_delay is of int type
*(data + sizeof(int)) = static_cast<char> (wakeup_code); //wakeup_code is of int type
现在在程序的另一端,我想要撤消此操作。也就是说,从这个char数组中,我需要获取time_delay和wakeup_code的值。
我该怎么做?
谢谢, 尼克
P.S:我知道这是一种愚蠢的做法,但请相信我这是一种约束。答案 0 :(得分:3)
我认为当您编写static_cast<char>
时,该值将转换为1字节的字符,因此如果它不适合开头的字符,则会丢失数据。
我要做的是使用*((int*)(data+sizeof(int)))
和*((int*)(data+sizeof(int)))
来读取和写入数组的内容。
*((int*)(data+sizeof(int))) = wakeup_code;
....
wakeup_code = *((int*)(data+sizeof(int)));
或者,你也可以写:
reinterpret_cast<int*>(data)[0]=time_delay;
reinterpret_cast<int*>(data)[1]=wakeup_code;
答案 1 :(得分:3)
如果您正在使用PC x86架构,那么没有对齐问题(速度除外),您可以将char *
转换为int *
来进行转换:
char data[20];
*((int *)data) = first_int;
*((int *)(data+sizeof(int))) = second_int;
,只需交换data
的边,就可以使用相同的语法从=
进行阅读。
但请注意,此代码不可移植,因为存在一种架构,其中未对齐的操作可能不仅慢而且实际上非法(崩溃)。
在这些情况下,可能最好的方法(在data
的情况下也为您提供字节顺序控制是不同系统之间通信协议的一部分)是在代码中一次显式构建整数:
first_uint = ((unsigned char)data[0] |
((unsigned char)data[1] << 8) |
((unsigned char)data[2] << 16) |
((unsigned char)data[3] << 24));
data[4] = second_uint & 255;
data[5] = (second_uint >> 8) & 255;
data[6] = (second_uint >> 16) & 255;
data[7] = (second_uint >> 24) & 255;
答案 2 :(得分:1)
我没有尝试过,但以下情况应该有效:
char data[20];
int value;
memcpy(&value,data,sizeof(int));
答案 3 :(得分:1)
尝试以下方法:
union IntsToChars {
struct {
int time_delay;
int wakeup_value;
} Integers;
char Chars[20];
};
extern char* somebuffer;
void foo()
{
IntsToChars n2c;
n2c.Integers.time_delay = 1;
n2c.Integers.wakeup_value = 2;
memcpy(somebuffer,n2c.Chars,sizeof(n2c)); //an example of using the char array containing the integer data
//...
}
使用此类联合应消除对齐问题,除非将数据传递给具有不同体系结构的计算机。
答案 4 :(得分:0)
#include <sstream>
#include <string>
int main ( int argc, char **argv) {
char ch[10];
int i = 1234;
std::ostringstream oss;
oss << i;
strcpy(ch, oss.str().c_str());
int j = atoi(ch);
}