我有一个64字节的块,并希望在最后添加64位(8字节)数据块。
typedef unsigned char uint1; // 1 Byte
typedef unsigned int uint4; // 4 Byte
// The 64 Byte-Block:
int BLOCKSIZE=64;
static uint1 padding[BLOCKSIZE] = {
0x80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
};
// [[10000000][00000000].........[00000000]]
// The 64 Bit (8 Byte-Block):
uint4 appendix[2] = {};
appendix[1] = 0x000000ff;
// [[00000000000000000000000000000000][00000000000000000000000011111111]]
在memcpy从附录到填充的最后8个字节的8个字节之后
memcpy(&padding[56], &appendix, 8);
看起来像
static uint1 padding[BLOCKSIZE] = {
0x80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0xff, 0, 0, 0, 0
};
但不应该看起来像这样吗?
static uint1 padding[BLOCKSIZE] = {
0x80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0xff
};
我不知道这里有什么问题!?!?
你能帮助我吗?
答案 0 :(得分:1)
appendix[1] = 0x000000ff;
// [[00000000000000000000000000000000][00000000000000000000000011111111]]
您正在对字节顺序(字节顺序)做出假设。你无法做出这样的假设。根据架构的字节顺序,appendix
也可以这样表示:
// [[00000000000000000000000000000000][11111111000000000000000000000000]]
如果要专门设置最后一个字节,则需要对字节进行操作,而不是多字节整数。像这样举例如:
uint1 appendix[8] = {};
appendix[7] = 0xff;
如果你确实需要最后8个字节来表示两个4字节整数,那么你的代码在这方面是正确的,只有你对内存应该是什么样的假设是错误的。
如果整数必须按特定字节顺序通过网络发送,则必须适当地转换它。 POSIX提供了htonl
及其姊妹功能。这些功能也由msvc提供。
您还假设unsigned int
是4个字节。它不能保证。如果需要4字节整数,请使用int32_t
。
更新
我的目标是实现MD5,我需要附加一个64位的文件长度表示。
根据rfc1321:
......一系列的 字节可以解释为32位字的序列,其中每个字 连续的四个字节组被解释为带有的字 首先给出的低阶(最低有效)字节。
MD5是小端。因此,在不转换字节顺序的情况下写入2 * 4数组只能在小端处理器上正常工作。
我建议使用8 * 1字节数组,以便您可以完全按照规范要求控制字节的顺序。或者,如果您使用的是Linux或其他提供它们的平台,则可以使用htole32
和le32toh
函数转换为正确的字节顺序。在另一个平台上,您可能需要自己实现它们。
答案 1 :(得分:-1)
所以,就我能理解RFC1321而言,我需要原始消息(文件)大小的64位整数表示。文件大小为64字节。在64位整数中,值64是二进制的:
0000000000000000000000000000000000000000000000000000000001000000
或:
0000001000000000000000000000000000000000000000000000000000000000
我有两个解码功能,但我不知道哪个适合md5?
答案 2 :(得分:-2)
你应该看看Endianless。你的选择是big-endian。