我有一个字符数组和指向它的指针.我需要将第一个8Bytes(8字节的二进制值)添加到第二个8字节模2exp(64).我怎么能这样做?
我找到了解决方案.但做这些事情肯定不好(见代码).然而,将结果放在chars数组中会很好.
void init(const unsigned char *k) {
uint64_t *kp = k;
uint64_t sum = (*kp + *(kp+1)) % pow(2,64)
}
Run Code Online (Sandbox Code Playgroud)
感谢帮助
你不需要它% pow(2,64),实际上它会引入错误,因为它会将结果转换为和从中转换double.类型中的算术uint64_t已经模2 ^ 64.
读取8个字节作为a的问题uint64_t基本上是关于你想要它处理的C实现,以及char数组中8个字节的格式.
如果你知道char数组中的8个字节与你的系统具有相同的字节序(即,如果你的系统是big-endian,那么最重要的字节是第一个,如果你的系统是little-endian,那么最重要的字节是最后的),那么你正在做的事情可能还行.但是,如果系统上存在对齐限制,那么提供缓冲区的人必须确保它正确对齐uint64_t.
如果数据来自某个文件或互联网,那么字节序可能与系统不匹配,并且可能无法正确对齐.
如果8个字节是little-endian,那么这个代码在big-endian系统上会失败,所以如果你想让你的代码可移植,你就必须做其他事情.有些系统unit64_t不占用8个字节,甚至memcpy不起作用.函数的规范可能意味着它完全不适用于这样的系统,但在某些情况下,将8个char的数组转换为a是有意义的uint64_t,而不管实际上CHAR_BIT是否大于8.
对于可靠的基本解决方案:一次读取一个字节并将各部分相加(左移0,然后8,依此类推).如果您不喜欢它的外观,请假设您需要支持哪些平台并进行优化.
但是,如果您希望将结果返回到char数组中,那么您将读取数据,然后反转该过程 - 对于您的代码,*((uint64_t*)output_buffer) = kp[0] + kp[1];.