如何实现字节数组转十六进制字符串及逆向还原为Base64?
逆向Base64转格式化指纹字符串的流程及问题修复
正向流程拆解
原代码是将Base64字符串先转字节数组,再转带连字符的十六进制字符串,最后通过FormatFingerOp处理为带空格分隔的格式化指纹:
var val = FormatFingerOp(BitConverter.ToString(Convert.FromBase64String("EcE4Zodu3wRTBXntCdUvifj+/GggA3DnG6zEKRZGpcY=")));
FormatFingerOp的具体逻辑:把带连字符的十六进制字符串(如A1-B2-C3-D4)拆分为单个十六进制对,拼接后每2个对(4个字符)加一个空格,最终输出格式类似A1B2 C3D4:
var fp = ""; string[] keys = val.Split('-'); for (int i = 1; i <= keys.Length; i++) { fp += keys[i - 1]; if (i % 2 == 0) fp += " "; }
现有逆向代码的问题
你写的逆向代码有两个关键错误:
- 没有先移除格式化指纹中的空格,直接遍历字符添加连字符,会把空格混入十六进制字符串,导致后续字节转换失败。
- 变量引用混乱:比如用了
val变量,但逆向流程中val应该是处理后的无连字符十六进制字符串,而非原指纹。
正确的逆向实现
逆向需要从格式化指纹(如A1B2 C3D4)还原回原始Base64字符串,分三步完成:
步骤1:还原为带连字符的十六进制字符串
先去掉所有空格,再每2个字符插入一个连字符,得到和BitConverter.ToString输出一致的格式:
// fp为格式化后的指纹字符串 string cleanedFp = fp.Replace(" ", ""); // 移除所有空格,得到连续十六进制字符 string hexWithDashes = ""; for (int i = 0; i < cleanedFp.Length; i += 2) { if (i > 0) hexWithDashes += "-"; hexWithDashes += cleanedFp.Substring(i, 2); }
步骤2:转换为字节数组
拆分带连字符的十六进制字符串,逐个转换为字节:
string[] hexPairs = hexWithDashes.Split('-'); byte[] byteArray = new byte[hexPairs.Length]; for (int i = 0; i < hexPairs.Length; i++) { byteArray[i] = Convert.ToByte(hexPairs[i], 16); }
步骤3:还原为Base64字符串
最后将字节数组转回Base64:
string originalBase64 = Convert.ToBase64String(byteArray); // 最终输出应为原始的"EcE4Zodu3wRTBXntCdUvifj+/GggA3DnG6zEKRZGpcY="
字节数组与十六进制字符串的转换说明
字节数组转十六进制字符串
- 系统自带方法:
BitConverter.ToString(byteArray),输出带连字符的格式(如A1-B2-C3)。 - 自定义无连字符格式:遍历每个字节,用
ToString("X2")(大写)或"x2"(小写)拼接:
string hexString = string.Concat(byteArray.Select(b => b.ToString("X2")));
十六进制字符串转字节数组
- 带连字符格式:先拆分
Split('-'),再逐个转换为字节:
string[] hexPairs = hexWithDashes.Split('-'); byte[] bytes = hexPairs.Select(p => Convert.ToByte(p, 16)).ToArray();
- 无连字符格式:每2个字符为一组转换,注意字符串长度必须是偶数:
byte[] bytes = new byte[hexString.Length / 2]; for (int i = 0; i < hexString.Length; i += 2) { bytes[i/2] = Convert.ToByte(hexString.Substring(i, 2), 16); }
内容的提问来源于stack exchange,提问作者Zeynep Aydemir
相关产品推荐
相关产品推荐

