FoxTable中MD5Encrypt方法与PHP中md5加密字符串的差异与对齐

FoxTable使用人并不多,但是在避免不了的情况下注意尤其需要注意语言(.NET)本身与其他语言的差异。

1. .NET 的字符串本质

  • VB.NET/ C# 里,String 在内存里永远是 UTF-16(Little Endian)。
  • 当写 Encoding.UTF8.GetBytes(…),才会转成 UTF-8。
  • 但是 MD5Encrypt 方法 其实没转 UTF-8,而是直接拿 .NET Unicode(UTF-16LE) 的字节数组去算 MD5。 所以 VB 端的输入是 UTF-16LE 编码的字节序列。

2. PHP 默认字符串处理

  • PHP 里,字符串就是字节序列,没有内建“字符集”的概念。
  • 源文件保存为 UTF-8 时,$orgStr 实际就是 UTF-8 字节。
  • md5($str, true) 算的是 UTF-8 字节的 MD5。

👉 这就是为什么得到 不一样字符串的原因。

3. 关键对齐处理

// 关键:转成 UTF-16LE,再算 MD5(二进制) → base64
$utf16le = iconv('UTF-8', 'UTF-16LE', $orgStr);
//$utf16le = mb_convert_encoding($orgStr, 'UTF-16LE', 'UTF-8');
$result  = base64_encode(md5($utf16le, true));