如何将逐字节取反读写文件的Node.js脚本转换为等效C#代码
问题背景
现有Node.js文件处理逻辑规则如下:
- 优先从命令行参数获取输入、输出文件路径,默认值分别为
file.txt、result.txt - 以二进制方式打开文件,逐1字节同步读取输入内容
- 对每个字节执行
255 - 字节原值的运算后写入输出文件
原Node.js实现代码如下:
let inPath = process.argv[2] || 'file.txt'; let outPath = process.argv[3] || 'result.txt'; fs.open(inPath, 'r', (errIn, fdIn) => { fs.open(outPath, 'w', (errOut, fdOut) => { let buffer = Buffer.alloc(1); while (true) { let num = fs.readSync(fdIn, buffer, 0, 1, null); if (num === 0) break; fs.writeSync(fdOut, Buffer.from([255-buffer[0]]), 0, 1, null); } }); });
你之前编写的C#代码采用StreamReader逐行读取字符的方案存在逻辑偏差,无法得到和Node版本一致的结果。
原C#代码的核心问题
StreamReader是文本读取类,会按照指定编码将原始字节解析为字符,遇到多字节编码的内容时会把多个原始字节合并为一个字符,无法拿到文件的原始单字节值,和原逻辑直接操作二进制字节的规则不符。- 没有实现命令行参数读取路径的逻辑,硬编码了文件路径。
- 字符串拼接的方式处理大文件时性能极差,且最终写入文本时会再次做编码转换,进一步破坏原始字节数据。
正确等效C#实现
C#中直接使用FileStream操作文件原始字节即可完全对齐原Node逻辑,字节运算直接对byte类型做255 - 原值计算即可,无需额外封装,完整代码如下:
using System; using System.IO; class ByteReverseProcessor { static void Main(string[] args) { // 对齐原逻辑的路径读取规则:优先取命令行参数,缺省用默认值 string inputPath = args.Length >= 1 ? args[0] : "file.txt"; string outputPath = args.Length >= 2 ? args[1] : "result.txt"; // 用FileStream直接读写原始字节,不做任何编码转换,对齐Node的二进制读写模式 using (FileStream inputStream = new FileStream(inputPath, FileMode.Open, FileAccess.Read)) using (FileStream outputStream = new FileStream(outputPath, FileMode.Create, FileAccess.Write)) { byte[] readBuffer = new byte[1]; int readCount; // 逐1字节同步读取,读到0字节时终止循环 while ((readCount = inputStream.Read(readBuffer, 0, 1)) > 0) { // 执行255减原字节值的运算 byte processedByte = (byte)(255 - readBuffer[0]); outputStream.WriteByte(processedByte); } } } }
逻辑对齐说明
- 路径规则:和Node版本完全一致,命令行传入的第一个自定义参数为输入路径,第二个为输出路径,缺省值匹配。
- 读写模式:输入文件以只读模式打开现有文件,输出文件以创建覆盖模式打开,和Node的
r、w打开标记行为一致。 - 处理逻辑:完全不涉及文本编码转换,逐字节读取原始二进制数据做运算后写入,处理结果和Node版本完全一致。
- 资源管理:
using语法块会在读写完成后自动释放文件句柄,避免资源泄漏。
内容的提问来源于stack exchange,提问作者takatto
相关产品推荐
相关产品推荐

