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

在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 22:50:40