我有一个结构:
union W128_T {
uint32_t u[4];
uint64_t u64[2];
};
struct SFMT_T {
/** the 128-bit internal state array */
w128_t state[SFMT_N];
/** index counter to the 32-bit internal state array */
int idx;
};
它是伪随机发生器,mersenne twister的实现。我想向所有工作人员发送SFM_T元素。我有两个选择。
使用char数组存储状态数组:我计划创建一个大小为[SFMT_N * 16 + 2]
的char数组,因为128位变量等于16个字符而+2
表示idx
变量。我不知道如何将状态数组更改为字符数组。我为这个序列化写了一些代码:
typedef struct SFMT_T sfmt_t;
char * serialize(sfmt_t* sfmt)
{
char buffer[SFMT_N*16+sizeof(int16_t)];
int16_t tmp_size = 0 ;
int8_t offset = 0;
int i=0,j;
tmp_size =(4*sizeof(uint32_t));
for(i=0;i<SFMT_N;i++)
{
memcpy(buffer+offset,&sfmt->state[i].u, tmp_size);
for(j=offset;j<offset+tmp_size;j++)
{
printf("buffer %c \n",buffer[j]);
}
offset += tmp_size;
}
memcpy(buffer+offset,&sfmt->idx,sizeof(uint16_t));
return buffer;}
void deserialize(char* buffer, sfmt_t* sfmt)
{
int16_t tmp_size,start,i ;
for(i=0;i<SFMT_N;i++)
{
start = sizeof(uint32_t)*4*i;
tmp_size =(4*sizeof(uint32_t));
memcpy(sfmt->state[i].u,&buffer[start], tmp_size);}
for(i=0;i<SFMT_N;i++)
{
printf("%d %d %d %d \n",sfmt->state[i].u[0],sfmt->state[i].u[1],sfmt->state[i].u[2],sfmt->state[i].u[3]);
} }
它并没有准确地给出我想要的东西。我错过了什么?
另外,我想知道哪种方式对分布式系统更有效。