在NodeJs中编写Java.class文件(保留幻数)
我有一个替换文件中某些字符串的服务器。看起来是这样的:在NodeJs中编写Java.class文件(保留幻数),java,android,node.js,magic-numbers,Java,Android,Node.js,Magic Numbers,我有一个替换文件中某些字符串的服务器。看起来是这样的: var stringToBeReplacedWith = "Cool text"; var data = fs.readFileSync(file, 'utf-8'); var RegExp = new RegExp("Stringtobereplaced", 'g'); // global search data = fileContents.replace(RegExp, stringToBeReplacedWith); fs.w
var stringToBeReplacedWith = "Cool text";
var data = fs.readFileSync(file, 'utf-8');
var RegExp = new RegExp("Stringtobereplaced", 'g'); // global search
data = fileContents.replace(RegExp, stringToBeReplacedWith);
fs.writeFileSync(file, data);
该代码通过Mime类型/编码更改来工作
如何确保在替换字符串时保留Mime类型?我注意到有很多库可以读取mimetype,但(到目前为止)我还没有找到一个库可以执行相反的操作。这是因为
。class
文件是二进制的。您正在以UTF-8字符串的形式读取中的文件。因此,当您将其写回时,它将其写为格式错误的UTF-8字符串(因此更改了幻数)
只要不尝试替换多字节字符,就可以更改
var data = fs.readFileSync(file, 'utf-8');
到
及
到
或
它应该可以像您期望的那样工作。在写入文件时,我得到了:“错误:未知编码”。我知道有很多方法可以使用库()对文件进行“编码”,但这需要编码吗?您可能知道要使用什么编码吗?您使用的是什么版本的node?您也可以尝试使用我现在在回答中包含的
fs.writeFileSync
。只需使用“binary”而不是{encoding:'binary}就可以修复它>执行的代码。但是在编译代码时,我得到了以下错误:“未知标记字节:6f”(而不是3f,对于一些文件也是54和3f)。知道为什么会这样吗?另外,我在节点10上,我不熟悉Java.class
格式。也许它存储的字符串前面有一个长度值,而您使字符串变大或变小,但不更新长度值?因此,它最终读取字符串的过去或内部,并找到一个意外的字节值?JAVA是ISO 8859-1,带有\uxxx转义序列,表示Unicode BMP字符。代理项范围内\uxxx转义序列的连续对(如UTF-16中的转义序列)表示BMP之外的Unicode字符-
var data = fs.readFileSync(file, 'binary');
fs.writeFileSync(file, data);
fs.writeFileSync(file, data, { encoding: 'binary' });
fs.writeFileSync(file, new Buffer(data, 'binary'));