Nodejs:将字符串转换为缓冲区
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中一直得到"内容编码错误"。就好像压缩的内容没有被正确传输。我已经通过console.log(x)和console.log(toTransmit)确保"toTransmit"与"x"相同。
值得注意的是,如果我用简单的response.write(x)
代替response.write(new Buffer(toTransmit))
,代理工作如预期,但我需要做一些有效载荷分析,然后传递"toTransmit",而不是"x"。
我也尝试过response.write(toTransmit)
(即没有转换到缓冲区),我一直得到相同的内容编码错误。
我真的卡住了。我以为我通过将字符串转换为每个另一个线程(http://stackoverflow.com/questions/7090510/nodejs-content-encoding-error)的缓冲区来解决这个问题,但我已经重新打开了一个新线程来讨论我正在经历的这个新问题。
我应该补充一下,如果我在Opera中通过代理打开一个页面,我会得到gobblydeegook -就好像压缩的数据被损坏了。
如有任何见地,不胜感激。
提前致谢
这个怎么样?
var responseData = Buffer.from(x, 'utf8');
from:将字符串转换为缓冲节点
无需深入研究代码,在我看来,您可能想更改
var responseData=x.toString();
var responseData=x.toString("binary");
最后和
response.write(new Buffer(toTransmit, "binary"));
From the docs:
纯Javascript对Unicode友好,但对二进制数据不友好。当处理TCP流或文件系统时,有必要进行处理八隅体流。Node有几种策略来操作、创建、和消费八位元流。
原始数据存储在Buffer类的实例中。缓冲区是类似于整数数组,但对应于原始内存在V8堆之外分配。不能调整缓冲区的大小。
所以,不要使用字符串来处理二进制数据。
将proxy_request.write(chunk, 'binary');
改为proxy_request.write(chunk);
。
省略var responseData=x.toString();
,这是个坏主意。
在字符串上使用substr
,而在缓冲区上使用slice
。
使用buffertools中的"concat"方法,而不是对字符串执行+
。
实际上,自从Node.js v10+以来,new Buffer()已被弃用,因此使用Buffer.from(you_string,enecoding_format)代替new Buffer()更好改变这个
response.write(new Buffer(toTransmit));
:
response.write(Buffer.from(toTransmit,'binary'));
- 如何在JavaScript中将字符串转换为函数引用
- 是否可以将流同步转换为缓冲区
- 使用 ajax 时没有从文本到数组缓冲区的转换
- JavaScript-将数组缓冲区转换为字符串
- JavaScript 将缓冲区转换为数字
- NodeJs - 如何将数据块转换为新的缓冲区
- 如何将缓冲区对象转换为 Node.js 中的文件
- 将包含 ASCII 中二进制十六进制的字符串转换为缓冲区
- 如何将数组缓冲区转换为字符串
- 将缓冲区转换为数组
- 如何将缓冲区数组转换为十六进制
- 将Blob数据转换为javascript或节点中的Raw缓冲区
- Node.js将缓冲区转换为Int8Array
- 转换nodejs'浏览器缓冲区'javascript
- 将数组缓冲区转换为字符串
- Nodejs:将字符串转换为缓冲区
- 在JavaScript中转换任何数据到数组缓冲区
- 将数组缓冲区转换为字符串:超出最大调用堆栈大小
- 如何将 Javascript 对象转换为节点缓冲区
- 如何将getUsermedia音频流转换为blob或缓冲区