与c ++中的字节,块,en- /解码相混淆

时间:2015-11-04 12:26:04

标签: c++ byte

我有一个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
    };

我不知道这里有什么问题!?!?

你能帮助我吗?

3 个答案:

答案 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或其他提供它们的平台,则可以使用htole32le32toh函数转换为正确的字节顺序。在另一个平台上,您可能需要自己实现它们。

答案 1 :(得分:-1)

所以,就我能理解RFC1321而言,我需要原始消息(文件)大小的64位整数表示。文件大小为64字节。在64位整数中,值64是二进制的:

0000000000000000000000000000000000000000000000000000000001000000

或:

0000001000000000000000000000000000000000000000000000000000000000

我有两个解码功能,但我不知道哪个适合md5?

答案 2 :(得分:-2)

你应该看看Endianless。你的选择是big-endian。