c# - 将大型阵列传输到客户端

标签 c# javascript arrays web-services

我需要使用对 Web 服务的 AJAX 请求将大量 16 位整数传输到客户端。该数组本质上是具有一些附加元数据的图像的灰度像素数据。

原始图像采用浏览器不支持的专有格式。典型图像为 2000 像素 x 4000 像素,因此该数组可以包含 8,000,000+ 16 位值。

发出一个 AJAX 请求并在一次响应中返回整个数组是否可以接受,还是我应该分成更小的 block 并分别请求每个 block ?如果在一个响应中传输整个数组是一种公认​​的做法,我是否必须在请求期间处理不可靠的连接(或者在浏览器中“开箱即用”)?

我们正在编写客户端和 Web 服务,因此我们的方法非常灵活。

最佳答案

正如其他人提到的,如果您在服务器中启用 gzip 压缩传输,浏览器应该会自动解压缩图像。如果图像是具有大面积相同颜色的扫描文档,这实际上可以相当大地压缩图像;如果它更像是一张航拍照片,那就不是那么多了。

现在您在客户端有了图像,您还有另一个问题:如何处理这 800 万个 16 位像素。

在我们拥有类型化数组之前,我们不得不使用字符串来表示任意数据。这比听起来更安全,因为在 JavaScript 中,字符串是 16 位代码单元的序列,可能被解释为以 UTF-16 编码的文本。 JavaScript 对编码无效的字符串完全没有问题。

这意味着您可以将图像存储为一个长字符串,并使用 charCodeAt 访问各个像素。对于大多数操作目的,这应该相当快。

下面是一个将 16 位二进制数据(实际上是 PNG 图标)加载到字符串中并输出前 16 个元素的示例:

$.ajax({
    url:"http://fiddle.jshell.net/favicon.png",
    success: function(data) {
        // Now we have the data, let's show it:
        var out = "";
        for (var i = 0; i < 16; i++) {
            out += ","+data.charCodeAt(i).toString(16);
        }
        console.log(out.substring(1));
    },
    beforeSend: function ( xhr ) {
        xhr.overrideMimeType("text/plain; charset=utf-16be");
    },
    error: function(jqXHR, textStatus, errorThrown) {
        console.log("ERROR: "+textStatus+" "+errorThrown);
        console.log(jqXHR);
    },
})

(实例在 jsfiddle )

关于c# - 将大型阵列传输到客户端,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15585491/

相关文章:

string - 用于存储字符串的 PowerShell 数组

c# - OOP 和 C# 中密封抽象类的真正用途是什么?

c# - aspnet 5 RESTful api ModelState.IsValid == true 即使值根据 DataAnnotations 无效

javascript - 我是第一次使用 Electron ,而不是打开 HTML 文件,它需要一个空白的 Electron 页面

javascript - 我是否已达到数组中对象的限制?

javascript - 使用正则表达式将任何字符串分成整个单词、标点符号和 html 标签的数组

java - Point[] 数组在尝试设置变量时抛出 NullPointerException

c# - 有没有比使用 WhenAnyValue 和 BindTo 更好的方法来设置读写属性?

c# - 如何列出程序集中具有特定属性的所有类?

javascript - 在所有键值对都是唯一的对象数组中查找对象