给出下面的示例代码,它生成32个字节,并用零屏蔽第一个字节。
static uint256_t rand256(struct seed *seed)
{
seed->counter++;
return sha256(seed, sizeof(struct seed));
}
static uint256_t rand256_and_mask(struct seed *seed)
{
uint256_t r = rand256(seed);
memset(&r, 0, 27);
//r.i8[23] = 0xE;
return r;
}
我想按顺序获得字节(如\x09,\x0A ... 99
的顺序),其差值为+1
,就像如果第一次调用时最后一个字节是"\x09"
,那么第二次调用时它将是"\x0A"
。
注意:我正在处理的数字非常大,我的程序接受"uint256_t"
类型,声明如下:
union uint256_s
{
uint8_t i8[32];
uint16_t i16[16];
uint32_t i32[8];
uint64_t i64[4];
};
typedef union uint256_s uint256_t;
假设uint256_t r = rand 256(seed);在第一次执行我的程序时产生这个:
E8411A8777E440FD1FA6CBF5F5149D14B45844B32F7B720CE653686229F9B758
那么在rand256_and_mask()中的memset之后,返回的r
的值将是:
0000000000000000000000000000000000000000000000000000000029F9B758
在这里,我需要保留r
的值,然后在下一次调用时将其递增1(如果需要,请跳过rand 256()调用),因此r
的值将是:
0000000000000000000000000000000000000000000000000000000029F9B759
从技术上讲,我需要该程序来跟踪r
,因为它代表了范围中的一个位置。我不太懂C语言,所以我希望我能澄清一些事情。
C开发者请帮忙
2条答案
按热度按时间dzhpxtsq1#
您可以使用
memset
将其所有字节设置为0。要在C中按顺序生成字节,可以按如下方式修改提供的代码:每次调用
getNextNumber
函数时,它都会根据currentNumber
生成下一个顺序字节模式。bttbmeg02#
您可以使用此函数以big-endian字节顺序递增
uint8_t
数组:此函数将就地递增
uint256_t
中的一个(传递一个指向uint256_t
的指针):此函数将
uint256_t
递增值并返回递增后的值:更改
i16
、i32
和i64
成员值的方式将取决于计算机的本机字节顺序。inc256()
和inc256p()
不会屏蔽结果,但incu8v()
可用于递增字节的子序列,例如请注意,以
int
或uint
开始并以_t
结尾的标识符是C标准保留的,因此类型名称uint256_t
应重命名为不保留的名称。