You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C#与Node.js中Buffer转String结果不一致问题求助

SHA512哈希转换:C#与Node.js字符串转换差异问题及解决方法

我正尝试将一段C#的SHA512哈希转换代码迁移至Node.js,但在将Buffer转换为字符串时得到了不同的结果。

C#代码及输出

string str = "34924979";
System.Security.Cryptography.SHA512 sha = new System.Security.Cryptography.SHA512Managed();
byte[] ba = System.Text.Encoding.ASCII.GetBytes(str);
byte[] data= sha.ComputeHash(ba);
Console.WriteLine(System.Text.Encoding.ASCII.GetString(data));

输出:

?????gV)????∟?Z?s??v$We-??N?"?w????0??\i♠G???

Node.js代码及输出

const crypto = require('crypto')

const str = '34924979';
const sha = crypto.createHash('sha512').update(str).digest('utf8');
const hash = sha.toString('utf-8').replace(/\uFFFD/g, '?');
console.log(hash);

输出:

????gV)????∟?Z?v$We-??N?"?w????0?\i♠Gߕ?

差异原因

核心问题是编码处理逻辑不一致:

  • C#使用Encoding.ASCII.GetString转换哈希字节数组:ASCII编码仅支持0-127范围内的字节,超过127的字节直接替换为?;0-127内的非可打印控制字符(如特殊符号、转义字符)会保留原始字节对应的字符。
  • Node.js中直接调用digest('utf8'):UTF-8编码对无效字节序列(哈希中大量存在)会替换为�(U+FFFD),后续替换为?的操作无法完全匹配C#的ASCII转换规则,同时Node.js默认用UTF-8处理输入字符串转字节,和C#的ASCII输入编码也存在差异。

解决方法

要得到和C#完全一致的结果,需要复刻C#的ASCII编码转换逻辑,同时确保输入字符串的编码处理一致:

const crypto = require('crypto')

const str = '34924979';
// 显式用ASCII编码处理输入字符串,和C#的Encoding.ASCII.GetBytes对齐
const hashBuffer = crypto.createHash('sha512').update(str, 'ascii').digest();
// 逐个字节处理,模拟C#的ASCII.GetString逻辑
let result = '';
for (const byte of hashBuffer) {
  // 0-127范围直接转ASCII字符,否则替换为?
  result += byte <= 127 ? String.fromCharCode(byte) : '?';
}
console.log(result);

这段代码做了两个关键调整:

  1. 调用update(str, 'ascii'):确保输入字符串转字节的编码和C#一致,避免默认UTF-8带来的差异。
  2. 遍历哈希Buffer逐个处理字节:严格按照ASCII编码规则转换,超过127的字节替换为?,0-127的字节直接转为对应ASCII字符(包括控制字符),完全匹配C#的转换逻辑。

内容的提问来源于stack exchange,提问作者Vitor Bersani

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.05 22:55:38