在JavaScript中读取7BitEncodedInt及C#风格字符串的方案求助
解决方案
一、手动实现核心逻辑(无依赖)
C#的BinaryReader.ReadString()逻辑是:先读取一个**7位编码整数(7BitEncodedInt)**表示字符串的UTF-16字符数,再读取对应长度的UTF-16LE字节,最后转成字符串。以下是JavaScript中的实现代码:
1. 读取7BitEncodedInt
function read7BitEncodedInt(buffer, offset) { let value = 0; let shift = 0; let byte; do { if (offset >= buffer.length) { throw new Error("Unexpected end of buffer while reading 7BitEncodedInt"); } byte = buffer[offset++]; value |= (byte & 0x7F) << shift; shift += 7; if (shift >= 32) { throw new Error("7BitEncodedInt exceeds 32-bit integer limit"); } } while ((byte & 0x80) !== 0); return { value, offset }; }
2. 读取C#风格字符串
function readCSharpString(buffer, offset) { // 先读字符串长度(7BitEncodedInt格式) const lenResult = read7BitEncodedInt(buffer, offset); const charCount = lenResult.value; offset = lenResult.offset; // 每个UTF-16字符占2字节,计算所需总字节数 const byteCount = charCount * 2; if (offset + byteCount > buffer.length) { throw new Error("Insufficient bytes for string data"); } // 截取对应字节并解码为UTF-16LE字符串 const strBuffer = buffer.slice(offset, offset + byteCount); const decoder = new TextDecoder('utf-16le'); const str = decoder.decode(strBuffer); return { str, offset: offset + byteCount }; }
使用示例(Node.js环境)
const fs = require('fs'); // 读取C#生成的二进制文件到Buffer const buffer = fs.readFileSync('your-csharp-file.bin'); let offset = 0; // 读取第一个字符串 const result = readCSharpString(buffer, offset); console.log('读取到的字符串:', result.str); offset = result.offset; // 继续读取其他二进制数据...
二、使用现成工具库
如果不想手动实现,可以使用专门模拟C# BinaryReader的npm包:
csharp-binary-reader:该库完整实现了C#BinaryReader的核心方法,包括直接支持7BitEncodedInt解析的readString()。
安装命令:npm install csharp-binary-reader
使用示例:const { BinaryReader } = require('csharp-binary-reader'); const fs = require('fs'); const buffer = fs.readFileSync('your-csharp-file.bin'); const reader = new BinaryReader(buffer); const str = reader.readString(); console.log(str);
内容的提问来源于stack exchange,提问作者Lost
相关产品推荐
相关产品推荐

