javascript - 从 JavaScript 字符串中读取字节

标签 javascript

我有一个包含 JavaScript 二进制数据的字符串。例如,现在我想从中读取一个整数。所以我得到前 4 个字符,使用 charCodeAt,进行一些移位等操作以获得一个整数。

问题是 JavaScript 中的字符串是 UTF-16(而不是 ASCII),charCodeAt 经常返回高于 256 的值。

Mozilla reference声明“前 128 个 Unicode 代码点是 ASCII 字符编码的直接匹配”。 (ASCII 值 > 128 怎么样?)。

如何将 charCodeAt 的结果转换为 ASCII 值?或者是否有更好的方法将四个字符的字符串转换为 4 字节整数?

最佳答案

我相信您可以通过相对简单的位操作来做到这一点:

function stringToBytes ( str ) {
  var ch, st, re = [];
  for (var i = 0; i < str.length; i++ ) {
    ch = str.charCodeAt(i);  // get char 
    st = [];                 // set up "stack"
    do {
      st.push( ch & 0xFF );  // push byte to stack
      ch = ch >> 8;          // shift value down by 1 byte
    }  
    while ( ch );
    // add stack contents to result
    // done because chars have "wrong" endianness
    re = re.concat( st.reverse() );
  }
  // return an array of bytes
  return re;
}

stringToBytes( "A\u1242B\u4123C" );  // [65, 18, 66, 66, 65, 35, 67]

通过读取字节数组就好像它是内存并将其相加成更大的数字来总结输出应该是一件简单的事情:

function getIntAt ( arr, offs ) {
  return (arr[offs+0] << 24) +
         (arr[offs+1] << 16) +
         (arr[offs+2] << 8) +
          arr[offs+3];
}

function getWordAt ( arr, offs ) {
  return (arr[offs+0] << 8) +
          arr[offs+1];
}

'\\u' + getWordAt( stringToBytes( "A\u1242" ), 1 ).toString(16);  // "1242"

关于javascript - 从 JavaScript 字符串中读取字节,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1240408/

相关文章:

java - Spring 4 加密器与 cryptojs

javascript - HTML 导入不起作用...即使它受支持

javascript - 如何在 Angular 中使用来自 jQuery ajax 调用的 promise

javascript - 在 cordova 中从 objective-c 调用 javascript

javascript - 如何右对齐/对齐 Bootstrap 下拉菜单项?

javascript - 缺少形式参数 javascript

javascript - 在 PHP while 循环中使用 jQuery 函数

javascript - 如何将包含另一个div的类的变量传递给JS函数并使用它来显示/隐藏相应的div?

javascript - 在 ACE 编辑器中更改行高?

javascript - 监听js变量变化