【问题标题】:I need to convert a binary string to ascii array using javascript. (UTF-16 to ascii conversion) [closed]我需要使用 javascript 将二进制字符串转换为 ascii 数组。 (UTF-16 到 ascii 的转换)[关闭]
【发布时间】:2021-09-05 06:55:42
【问题描述】:

我想将文本文件中的“二进制”数据读入 javascript 字符串(我这样做了),并将字节转换为 ascii 值数组。几天来我一直在尝试完成此操作,但由于我对 utf-16 或 js 没有足够的经验,因此找不到解决方案。

我要转换的数据不是文本。该网站上的大多数示例都处理诸如“Hello”之类的字符串,我无法开始工作。二进制数据由一些(准确地说是 220032)字节组成,它们的值在 0 到 255 之间。

如果有人能指出正确的方向,我将不胜感激。

示例: 原始文件包括(我想得到的字节数组): 十六进制:80 00 F5 03 7E 36 41 01(十进制:128 0 245 3 126 54 65 1)

对于我得到的这些字节(使用 charCodeAt): 十进制:65533 0 65533 3 121 94 20 1


有关该问题的更多信息,因为 stackoverflow 表示它不够清楚。

我有一台分辨率为 382x288 的热像仪,即 110016 像素。每个像素都用一个无符号短表示,每个像素长 2 个字节。制作一帧热数据 220032 字节。我的空间有限,所以我没有考虑 json、xml 等。所以我使用我编写的 c++ 程序从相机获取数据,并将其作为 ascii 字符写入文本文件。

客户希望通过他的公司(电视的电脑平板电脑等)在本地服务器上查看图像。所以我决定为这个项目采用 asp/javascript 的方式。我对javascript不是很好,所以直到很久以后我才知道javascript对我不想要的字符串使用了UTF-16,因为我需要文件中每个字符的ascii代码。

感谢“Joachim Sauer”,他为我指明了正确的方向,我能够使用 fetch 和 Uint8Array 轻松解决问题。

async load_Frame(p_filename){
    await fetch("./frames/"+p_filename+".txt")
    .then(response=>{
        if (!response.ok) throw new Error("problem");
        return response.arrayBuffer();
    }).then(data=>{
         //Here i have the frame as i wanted.
         let frame = new Uint8Array(data);
    }
    }).catch(function(e){
          console.log(e);
    })
    }
    

和最终产品。 :) 我没有包括热转换例程,因为它们超出了问题的范围。

【问题讨论】:

  • 是的,在刷新之前才意识到这一点。不知道有没有办法改正?
  • 标签下有一个“编辑”链接。

标签: javascript binary utf-16


【解决方案1】:

您不能将任意二进制数据解释为 UTF-8 并期望它能够工作(即能够往返)。

UTF-8 内置了一定数量的错误检测,这意味着有很多字节序列不是有效的 UTF-8。

那些将报告错误。

通常这些错误会通过生成 a Unicode Replacement Character U+FFFD 以静默方式发出信号,但也可以通过某种异常或错误代码报告。

U+FFFD 也 恰好是 Unicode 代码点 65533,所以这正是这里发生的事情。

一个或多个不是有效 UTF-8 序列的字节被“解码”成这个替换字符。请注意,错误字节在结果字符串中不再可见:所有错误序列都折叠为该字符。如何处理多个后续错误有特定的规则,但从根本上说,您只是丢失了这些信息。

我无法真正告诉您如何“解决”这个问题,因为从根本上尝试将非文本二进制数据解释为 UTF-8 是行不通的。

如果您解释了为什么要这样做,我们可能会建议替代解决方案。这可能是XY Problem

【讨论】:

  • 感谢您的回答。现在很清楚FFFD了。 UTF-8 是错误的,因为 T.J.克劳德指出。我只想获取文本每个字节的 ascii 值。我应该相应地更新问题。
  • @Karter:ASCII 未定义在 127 以上,因此任何设置了最高值位的字节都会被类似地破坏。无论如何,您为什么要尝试将非文本数据解释为文本,这本身就是一件从根本上被破坏的事情,我不愿意提供一种“有效”的方式,而不知道它是否真的有必要。
  • 这是来自热像仪的一些数据。在 c++ 方面,我将数据作为一个无符号短裤数组。我的服务器(36TB)空间很小,可以保存数据,所以我必须有最小的文件。如果我从相机(0x900)中得到 2304,我将其保存为文本文件 09 00,我应该在客户端机器上返回 2304 并将其转换为位图。我无法使用 json 等,因为它们占用了太多空间。
  • @Karter:到目前为止,这一切都很好,也很有意义,但我不明白你为什么要在这里使用任何类型的“字符串”。您描述的所有内容都是纯二进制数据。我认为在 JavaScript 中,您可以使用 ArrayBuffer 之类的东西来处理它(但我不是 JavaScript 开发人员,所以这可能是完全错误的)。无论如何:避免使用字符串和其他“基于文本”的类型来处理此类内容,这只会导致痛苦而没有收获。另外:将 36TB 称为“小空间”让我感觉非常非常老。
  • 感谢您的提示。我将检查数组缓冲区。 36TB 的空间对于 382x288、每像素 2 字节、以 5 fps 工作 365 天 7/24 天的相机来说勉强够用(如果我计算正确,它将在 34TB 左右,如果我没有,你会看到我的在这里询问服务器上的解压缩:))。是的,我在 80 年代就开始使用 8kb 计算机。现在我们谈论的是 TB。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-03-30
  • 1970-01-01
  • 2016-10-02
  • 2014-06-14
  • 2011-07-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多