MD5 to Hex

文章讲述了计算机中正负数如何从十进制转换为十六进制,涉及到二进制、原码、反码和补码的概念。特别是对于负数,转换过程包括计算补码。此外,文章提到了MD5加密产生的16字节结果需要转换为十六进制字符串,举例使用了DigestUtils.md5Hex方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  1. 正数
    1. 每四位转换成16进制即可
    2.     十进制=> 二进制   =>  十六进制
    3.        15       00001111           0F
  2. 负数
    1. 计算机的负数不是用源码,而是用补码,所以需要转换反码,然后+1成补码,计算十六进制
    2. 下例类型为byte,其中最高位是符号位,为1
    3.  十进制=> 二进制原码   => 二进制反码 => 二进制补码 = > 十六进制
    4.      -91   => 11011011   => 10100100   => 10100101    => A5
  3. 案例
    1. 对于MD5加密,API返回的结果是一个长度为16的byte数组,按照比特位计算共128位
      1. DigestUtils.md5Hex("heloworld")
    2. 需要转换为十六进制,进行如上计算,即可。
      1. 实现方式可以负数+256 然后转换、正数直接转换
      2. 负数的二进制补码+二进制原码=256   (仅限于byte)

### MD5 哈希函数的 C 语言实现 下面展示了一个简化版的 MD5 哈希算法的 C 语言实现。完整的 MD5 实现较为复杂,涉及多个辅助函数以及位操作: ```c #include <stdio.h> #include <string.h> typedef unsigned char uint8; typedef unsigned int uint32; void rotate_left(uint32 *state, uint32 count) { *state = (*state << count) | (*state >> (32 - count)); } // F, G, H and I are basic MD5 functions. #define F(x,y,z) (((x) & (y)) | ((~x) & (z))) #define G(x,y,z) (((x) & (z)) | ((y) & (~z))) #define H(x,y,z) ((x) ^ (y) ^ (z)) #define I(x,y,z) ((y) ^ ((x) | (~z))) // Round 1 operations #define FF(a,b,c,d,x,s,ac) \ { \ (a) += F((b), (c), (d)) + (x) + (uint32)(ac); \ rotate_left(&(a), (s)); \ (a) += (b); \ } // Similar macros would be defined for GG, HH, II corresponding to rounds 2, 3, and 4. void md5_transform(uint32 state[4], const uint8 block[64]) { uint32 a = state[0]; uint32 b = state[1]; uint32 c = state[2]; uint32 d = state[3]; // Apply the round transformations using predefined macros like FF, GG etc. state[0] += a; state[1] += b; state[2] += c; state[3] += d; } void pad_message(const uint8 message[], size_t length, uint8 paddedMessage[]) { // Padding logic as per MD5 specification } void md5_hash(const char* input, char outputBuffer[33]) { static const uint32 init_state[4] = {0x67452301, 0xefcdab89, 0x98badcfe, 0x10325476}; uint32 state[4]; memcpy(state, init_state, sizeof(init_state)); // Convert string into byte array and apply padding here // Process each chunk of data through transform function // Finally convert resulting state back into hex characters stored in outputBuffer } int main() { char input[] = "The quick brown fox jumps over the lazy dog"; char result[33]; // For storing final hash value as hexadecimal digits memset(result, '\0', sizeof(result)); md5_hash(input, result); printf("MD5: %s\n", result); return 0; } ``` 这段代码展示了如何定义基本的操作宏来处理每一轮的数据转换,并通过`md5_transform()`来进行实际的消息摘要计算[^2]。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值