JavaScript 友好的二进制安全数据格式设计(不是 JSON 或 XML)

发布于 2024-10-30 08:03:43 字数 1280 浏览 1 评论 0原文

首先也是最重要的:在这种特定情况下,JSON 和 XML 不是一个选项,请不要建议它们。如果这让我更容易接受这个事实,想象一下我打算重新发明轮子进行自我教育。

回到正题:

我需要设计一种二进制安全的数据格式来对我发送到我编写的特定哑服务器的一些数据报进行编码(如果重要的话,用 C 语言)。

为了简化问题,假设我只发送数字、字符串和数组。

重要事实:服务器不(也不应该)了解有关 Unicode 之类的任何信息。它将所有字符串视为二进制 blob(并且从不查看它们的内部)。

我最初设计的格式如下:

  • 数据报: \n...
  • Value:
    • 数字:N\n<值>\n
    • 字符串:S\n<数字:字节大小>\n<字节>\n
    • 数组:A\n<数字:大小>\n...

示例:

[ 1, "foo", [] ]

序列化如下:

1   ; number of items in datagram
A   ; -- array --
3   ; number of items in array
N   ; -- number --
1   ; number value
S   ; -- string --
3   ; string size in bytes
foo ; string bytes
A   ; -- array --
0   ; number of items in array

问题是我 无法在 JavaScript 中可靠地获取字符串大小(以字节为单位)。

那么,问题是:如何改变格式,使字符串既可以在 JS 中保存,又可以在 C 中加载。

我不想向服务器添加 Unicode 支持。

而且我不太想在服务器上解码字符串(例如,从 base64 或简单地转义 \xNN 序列)——这需要使用动态字符串缓冲区,考虑到服务器有多愚蠢,这并不是那么理想...

有什么线索吗?

First and foremost: JSON and XML are not an option in this specific case, please don't suggest them. If this makes it easier to accept that fact, imagine that I intend to reinvent the wheel for self-education.

Back to the point:

I need to design a binary-safe data format to encode some datagrams I send to a particular dumb server that I write (in C if that matters).

To simplify the question, let's say that I'm sending only numbers, strings and arrays.

Important fact: Server does not (and should not) know anything about Unicode and stuff. It treats all strings as binary blobs (and never looks inside them).

The format that I originally devised is as follows:

  • Datagram: <Number:size>\n<Value1>...<ValueN>
  • Value:
    • Number: N\n<Value>\n
    • String: S\n<Number:size-in-bytes>\n<bytes>\n
    • Array: A\n<Number:size>\n<Value0>...<ValueN>

Example:

[ 1, "foo", [] ]

Serializes as follows:

1   ; number of items in datagram
A   ; -- array --
3   ; number of items in array
N   ; -- number --
1   ; number value
S   ; -- string --
3   ; string size in bytes
foo ; string bytes
A   ; -- array --
0   ; number of items in array

The problem is that I can not reliably get a string size in bytes in JavaScript.

So, the question is: how to change the format, so a string can be both saved in JS and loaded in C neatly.

I do not want to add Unicode support to the server.

And I do not quite want to decode strings on server (say, from base64 or simply to unescape \xNN sequences) — this would require work with dynamic string buffers, which, given how dumb the server is, is not so desirable...

Any clues?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

无声静候 2024-11-06 08:03:43

似乎用普通 C 读取 UTF-8 是 毕竟没那么可怕。因此,我扩展了协议以原生处理 UTF-8 字符串。 (但会很感激这个问题的现有答案。)

It seems that reading UTF-8 in plain C is not that scary after all. So I'm extending the protocol to handle UTF-8 strings natively. (But will appreciate an answer to this question as it stands.)

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文