Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/38.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将javascript字符串长度转换为字节数组[]_Javascript_Node.js_Bitconverter - Fatal编程技术网

将javascript字符串长度转换为字节数组[]

将javascript字符串长度转换为字节数组[],javascript,node.js,bitconverter,Javascript,Node.js,Bitconverter,我需要在javascript中将字符串的长度转换为长度为2(16位有符号整数)的字节数组,相当于C#Bitconverter.GetBytes(短值) 示例:295->[1,39]。当您使用节点时,您需要一个缓冲区。查看文档。例如: //Make a string of length 295 const st="-foo-".repeat(59); //Create a byte array of length 2 const buf = Buffer.alloc(2); //Write the

我需要在javascript中将字符串的长度转换为长度为2(16位有符号整数)的字节数组,相当于C#Bitconverter.GetBytes(短值)


示例:295->[1,39]。

当您使用节点时,您需要一个
缓冲区。查看文档。例如:

//Make a string of length 295
const st="-foo-".repeat(59);
//Create a byte array of length 2
const buf = Buffer.alloc(2);
//Write the string length as a 16-bit big-endian number into the byte array
buf.writeUInt16BE(st.length, 0);
console.log(buf);
//<Buffer 01 27> which is [1, 39]
//生成长度为295的字符串
const st=“-foo-”。重复(59);
//创建长度为2的字节数组
const buf=缓冲区分配(2);
//将字符串长度作为16位大端数字写入字节数组
buf.writeUInt16BE(标准长度,0);
控制台日志(buf);
//也就是[1,39]

请注意,这将为您提供以字符为单位的字符串长度,而不是字符串的字节长度-两者可能相同,但不能保证相同。

最后,javascript字符串内容可能最终大于64KB,因此转换为字节后的字符串长度可能不适合16位整数或2个字节。最小代码应首先检查字符串长度(如果
st.length>=32768
,则抛出错误),然后使用2字节缓冲区(来自
buffer.alloc(2)
),然后使用
buffer.writeUInt16BE(st.length)
将字符串长度输出到缓冲区

制作无法处理正确字符串内容的代码通常是一个坏主意:包含32768个或更多字符的文本根本不例外。但如果文本来自具有长度限制的数据库字段,而不是来自HTML输入表单字段中的用户输入,则可能是正确的,这首先需要验证(即使该表单使用有效的UTF-8,验证程序仍应检查:不要假设“用户”如果使用浏览器,则可能是一个恶意机器人试图破坏您的Web应用程序以获取安全漏洞、获得某些权限或窃取私人数据

在web上,在所有处理之前,所有输入字段(包括组合选择器和单选按钮或复选框)都需要对提交的表单数据进行输入验证(有效编码、长度限制、文本格式)(但您可能希望放弃所有名称不正确的未知字段)。确保您的处理可以处理通过web应用验证程序的所有文本长度(包括使用嵌入式web组件的自包含应用程序,如移动应用程序或桌面应用程序,而不仅仅是web浏览器)


恕我直言,使用这样的16位假设是不好的,但如果您确保之前已经检查了验证器、已实现和长度约束,那么您的问题是有效的。

什么是[1,39]意思是?它甚至不是UTF8。我想你的意思是它是UTF16BE。长度为1的Javascript字符串可能不一定包含1个完整的Unicode字符。如果它包含Unicode代理,它不是字符,而是一个16位代码单元,不能转换为UTF16BE(首先,它应该与第二个代理项配对,以便在UTF16BE中转换为4个字节,在UTF8中转换为4个不同的字节)。在Javascript中,字符串不限于UTF16,它们是16位代码单元的任意向量,在没有例外或替换的情况下不总是转换为任何UTF。可能重复
[value>>8&0xFF,value&0xFF];
返回一个数字的2个较低字节。@Thomas你是对的,但是有方法可以做到这一点,而且
缓冲区严格来说是一个字节数组(这是他要求的),最好使用库函数。@eutransmith你的答案没有给出我想要的结果。(295>>8&0xFF,295&0xFF)->[1,39]常量buf=Buffer.alloc(2);buf.writeUInt16BE(295,0);console.log(buf);我想Thomas的答案就是我想要的。请注意,如果字符串包含一个代理项,那么如果它包含2个字节,结果仍然是无效的UTF16BE,除非代理项在转换为UTF16BE中的两个字节之前被BMP中的其他替换字符替换,如U+FFFD或“?”。因此不要假设结果buf.writeUInt16BE()的t是有效的UTF16BE。它只是一个二进制数组,不一定是任何有效Unicode格式的文本,但可以在不丢失转换的情况下重新创建javascript字符串。另外,也不要将结果用作UTF8:它将被乱码,可能是有效的UTF8,但无效的HTML/XML,带有空字节。@verdy\p他的最初问题只是从字面上转换字符串l长度表示为2字节,而不是字符串本身。因此,虽然你是正确的,但这并不是他所问的。我添加了关于utf8等的部分,基本上是因为这是他根据自己的问题可能正在做的事情,但严格地说,这个问题只是关于从UInt16到字节数组(而不是字符数组)的转换,这是
Buffer
是。请注意,Buffer.from(“\u0B95”)返回一个3字节的缓冲区,因为它采用UTF-8的默认编码,但writeUInt16BE()不会生成UTF-8输出。writeUInt16BE()的正确缓冲区长度是Javascript字符串长度乘以2(与字符串包含的内容无关)。但结果永远不是有效的Unicode编码(未执行Unicode验证)。它只是二进制javascript字符串内容的另一种二进制表示形式,使用有序的8位字节而不是16位代码单位。@verdy\p提问者没有要求UTF-8输出,只要求字节数组。因此
Buffer.from(字符串)
可能不会分配任何内容,如果字符串不是有效的UTF16(即,如果它包含未配对的代理项),则可能返回错误,该字符串不能转换为UTF8,因此没有定义的缓冲区长度。