JavaScript - 文件到字节数组

标签 javascript

我试图让一个脚本工作,它被称为 sfo.js .
repo 仅提到了这种用法:

keys = parse_sfo(Some_ArrayBuffer);
console.log(keys['TITLE']);
望向 sfo.js , parse_sfosfoBytes争论。
由此我得出结论 sfoBytes参数需要是文件字节的数组缓冲区。
我试图制作一个将 SFO 文件解析为字节数组的脚本:
<script src="sfo.js"></script>
<script>
function stringToArrayBuffer(str) {
    var buf = [];
    
    for (var i=0, strLen=str.length; i<strLen; i++) {
        buf[i] = str.charCodeAt(i);
    }
    
    console.log(buf);

    return buf;
}

function testing(url) {
    var request = new XMLHttpRequest();
    request.open('GET', url, false);
    request.send(null);

    if (request.status === 200) {
        console.log(request.response);
        
        var response = request.response;
        var array = stringToArrayBuffer(response);

        return array;
    } else {
        alert('Error!');
    }
 }

var data = testing('param.sfo');
var sfo = parse_sfo(data);
</script>
这会在控制台中引发错误:
Uncaught RangeError: byte length of Uint32Array should be a multiple of 4 at new Uint32Array (<anonymous>)
    at readUint32At (sfo.js:20)
    at parse_sfo (sfo.js:113)
    at (index):29
我很确定我做错了什么。有人了解我如何使脚本正常工作吗?
我有 param.sfo 的示例文件:https://filebin.net/gghosrp6u93jn7y8 (如果不允许链接到下载,请告诉我)

最佳答案

好的,最后是工作示例。
我发现了一个小 param.sfo互联网上的文件。
笔记:

  • 文件阅读器有 2 个版本:本地和远程
  • 在下面的代码段中,您可以测试两者(我已将我的 param.sfo 添加为测试“远程”的外部链接)。要测试“本地”,您只需要从您的 PC 中选择任何 sfo 文件。
  • 因此,我显示了所有键,而不仅仅是“TITLE”(就像您的问题中那样)。然后您可以选择所需的 key

  • function getSfoLocal(callback) {
      // for now I use local file for testing
      document.querySelector('input').addEventListener('change', function() {
    
        var reader = new FileReader();
        reader.onload = function() {
    
          var arrayBuffer = this.result;
          var array = new Uint8Array(arrayBuffer);
          // var binaryString = String.fromCharCode.apply(null, array);
    
          if (typeof callback === 'function') callback(array);
        }
        reader.readAsArrayBuffer(this.files[0]);
    
      }, false);
    }
    
    function getSfoRemote(url, callback) {
      var concatArrayBuffers = function(buffer1, buffer2) {
    
        if (!buffer1) {
          return buffer2;
        } else if (!buffer2) {
          return buffer1;
        }
    
        var tmp = new Uint8Array(buffer1.length + buffer2.length);
        tmp.set(buffer1, 0);
        tmp.set(buffer2, buffer1.byteLength);
        return tmp.buffer;
      };
    
      fetch(url).then(res => {
        const reader = res.body.getReader();
        let charsReceived = 0;
        let result = new Uint8Array;
    
        reader.read().then(function processText({
          done,
          value
        }) {
          // Result objects contain two properties:
          // done  - true if the stream has already given you all its data.
          // value - some data. Always undefined when done is true.
          if (done) {
            if (typeof callback === 'function') callback(result);
            return result;
          }
    
          // value for fetch streams is a Uint8Array
          charsReceived += value.length;
          const chunk = value;
          result = concatArrayBuffers(result, chunk);
    
          // Read some more, and call this function again
          return reader.read().then(processText);
        });
      });
    }
    
    function getSfo(type, url, callback) {
      if (type === 'local') getSfoLocal(callback);
      if (type === 'remote') getSfoRemote(url, callback);
    }
    
    getSfo('local', null, (data) => {
      keys = parse_sfo(data);
      console.log('LOCAL =', keys);
    });
    
    function goremote() {
      getSfo('remote', 'https://srv-file9.gofile.io/download/Y0gVfw/PARAM.SFO', (data) => {
        keys = parse_sfo(data);
        console.log('REMOTE =', keys);
      });
    }
    div { padding: 4px; }
    <!--script src="https://rawcdn.githack.com/KuromeSan/sfo.js/c7aa8209785cc5a39c4231e683f6a2d1b1e91153/sfo.js" for="release"></script-->
    <script src="https://raw.githack.com/KuromeSan/sfo.js/master/sfo.js" for="develop"></script>
    
    <div>Local version: <input type="file" /></div>
    <div>Remote version: <button onclick="goremote()">Go remote</button></div>

    附言看来gofile.io我用于远程示例的服务有时不可见。如果您有 param.sfo 的永久链接,请告诉我。但现在我必须visit my file ,只有在那之后它才变得可见。

    关于JavaScript - 文件到字节数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63506575/

    相关文章:

    javascript - 如何测试组件中另一个模块的自定义指令

    javascript - 通过app.use()调用认证中间件

    javascript - React Hooks useState() 与对象

    javascript - 根据光标位置执行不同的功能(javascript)

    javascript - 我是否需要使用队列将文件从 Node.js 服务器上传到 Amazon S3?

    javascript - 捕获页面内的返回导航

    javascript - 尝试用数组填充 <select>

    javascript - 请求当前用户 API token Django REST Framework

    Javascript 小部件在 Sharepoint Web 部件中不起作用

    javascript - 无法使用 --out Comment : Getting Error 将 typescript 模块 (.ts) 文件连接到单个输出 (.js)