[英]Nodejs: convert string to buffer
我正在尝试将字符串写入套接字(套接字称为“响应”)。 这是我到目前为止的代码(我正在尝试实现字节缓存代理......):
var http = require('http');
var sys=require('sys');
var localHash={};
http.createServer(function(request, response) {
var proxy = http.createClient(80, request.headers['host'])
var proxy_request = proxy.request(request.method, request.url, request.headers);
proxy_request.addListener('response', function (proxy_response) {
proxy_response.addListener('data', function(x) {
var responseData=x.toString();
var f=50;
var toTransmit="";
var p=0;
var N=responseData.length;
if(N>f){
p=Math.floor(N/f);
var hash="";
var chunk="";
for(var i=0;i<p;i++){
chunk=responseData.substr(f*i,f);
hash=DJBHash(chunk);
if(localHash[hash]==undefined){
localHash[hash]=chunk;
toTransmit=toTransmit+chunk;
}else{
sys.puts("***hit"+chunk);
toTransmit=toTransmit+chunk;//"***EOH"+hash;
}
}
//remainder:
chunk=responseData.substr(f*p);
hash=DJBHash(chunk);
if(localHash[hash]==undefined){
localHash[hash]=chunk;
toTransmit=toTransmit+chunk;
}else{
toTransmit=toTransmit+chunk;//"***EOH"+hash;
}
}else{
toTransmit=responseData;
}
response.write(new Buffer(toTransmit)); /*error occurs here */
});
proxy_response.addListener('end', function() {
response.end();
});
response.writeHead(proxy_response.statusCode, proxy_response.headers);
});
request.addListener('data', function(chunk) {
sys.puts(chunk);
proxy_request.write(chunk, 'binary');
});
request.addListener('end', function() {
proxy_request.end();
});
}).listen(8080);
function DJBHash(str) {
var hash = 5381;
for(var i = 0; i < str.length; i++) {
hash = (((hash << 5) + hash) + str.charCodeAt(i)) & 0xffffffff;
}
if(hash<-1){
hash=hash*-1;
}
return hash;
}
问题是,我一直在 Firefox 中收到“内容编码错误”。就好像 gizipped 内容没有正确传输一样。 我已经通过 console.log(x) 和 console.log(toTransmit) 确保“toTransmit”与“x”相同。
值得注意的是,如果我将response.write(new Buffer(toTransmit))
替换为简单的response.write(x)
,代理将按预期工作,但我需要进行一些有效负载分析,然后传递“toTransmit”,而不是“x” ”。
我也尝试过response.write(toTransmit)
(即没有转换为缓冲区),但我一直收到相同的内容编码错误。
我真的卡住了。 我以为我通过按照另一个线程 (http://stackoverflow.com/questions/7090510/nodejs-content-encoding-error) 将字符串转换为缓冲区来解决这个问题,但我重新打开了一个新线程讨论我遇到的这个新问题。
我应该补充一点,如果我在 Opera 中通过代理打开一个页面,我会得到 gobblydeegook - 就好像 gzip 数据被破坏了一样。
非常感谢任何见解。
提前谢谢了,
在不深入研究您的代码的情况下,在我看来您可能想要更改
var responseData=x.toString();
至
var responseData=x.toString("binary");
最后
response.write(new Buffer(toTransmit, "binary"));
从文档:
纯 Javascript 对 Unicode 友好,但对二进制数据不友好。 在处理 TCP 流或文件系统时,需要处理八位字节流。 Node 有几种用于操作、创建和使用八位字节流的策略。
原始数据存储在缓冲区 class 的实例中。 Buffer 类似于整数数组,但对应于 V8 堆外的原始 memory 分配。 缓冲区无法调整大小。
所以,不要使用字符串来处理二进制数据。
更改proxy_request.write(chunk, 'binary');
到proxy_request.write(chunk);
.
省略var responseData=x.toString();
,这是个坏主意。
不要在字符串上执行substr
,而是在缓冲区上使用slice
。
而不是+
与字符串,使用来自buffertools的“concat”方法。
实际上,从 node.js v10+ 开始,现在 new Buffer() 已被弃用,因此最好使用 Buffer.from(,) 来自
response.write(new Buffer(toTransmit));
做
response.write(Buffer.from(toTransmit,'binary'));
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.