gpt4 book ai didi

c++ - 使用 ei_encode_string 对字符串进行编码

转载 作者:太空狗 更新时间:2023-10-29 20:55:03 26 4
gpt4 key购买 nike

我开始使用 ei 库在我的 c 程序中进行编码,然后将该编码数据传递给我的 erlang 客户端。我知道我可以使用 binary_to_term/1 来获取 erlang 中的数据。

在通过套接字发送之前,我很难尝试对该数据进行编码。顺便说一句,我已经建立了连接。

  int index = 0;
const char *buff = "Stackoverflow";
char p[strlen(buff) + 1];
ei_encode_string_len(p, &index, buff, strlen(buff))

输入是buff,第三个参数。p 是我希望编码字符串成为的输出缓冲区。

但是数据没有被编码并放入输出缓冲区

我试图通过遍历每个字符来打印输出缓冲区,并且可以看到 107 正在打印,其中 ETF 表示字符串,但不确定为什么没有对整个字符串进行编码。

有什么我想念的吗?

谢谢!

感谢您的帮助!

最佳答案

您的代码很好,只是您用来编码的缓冲区太小。

首先,让我们看一下使用term_to_binary转换术语“Stackoverflow”得到的二进制文件:

1> Term = term_to_binary("Stackoverflow").
<<131,107,0,13,83,116,97,99,107,111,118,101,114,102,108,
111,119>>

第一个字节,131,是term的version magic number;让我们暂时忽略它。第二个字节 107 表示编码数据的类型,正如您已经在问题中解释的那样。

接下来,让我们使用下面的代码(类似于您的代码)来查看 ei_encode_string_len 创建的数据:

int index = 0;
const char *buff = "Stackoverflow";
char p[strlen(buff) + 3];
memset(p, 0, sizeof p);
ei_encode_string_len(p, &index, buff, strlen(buff));
for (int i = 0; i < sizeof p; ++i)
printf("%d ", (unsigned char)p[i]);
printf("\n");

编译运行结果如下:

107 0 13 83 116 97 99 107 111 118 101 114 102 108 111 119

需要注意的是,在此代码中,缓冲区 p 比您的代码多了两个字节。这是因为编码缓冲区的第二个和第三个字节(此处分别保存值 013)是一个双字节大端值,对字符串长度进行编码, 13 个字节。我们可以很容易地在 Erlang 中看到这个长度:

2> length("Stackoverflow").
13

这两个字节之后是字符串数据,我们也可以使用 Erlang 查看其值:

3> [C || C <- "Stackoverflow"].
[83,116,97,99,107,111,118,101,114,102,108,111,119]

ei_encode_string_len 产生的值完全匹配,这些也与我们在 term_to_binary 产生的二进制文件中看到的相同。

最后,回到版本魔数(Magic Number):它必须是任何编码项中的第一个字节。要将其放入缓冲区,请在编码任何实际数据之前使用 ei_encode_version:

int index = 0;
const char *buff = "Stackoverflow";
char p[strlen(buff) + 4];
memset(p, 0, sizeof p);
ei_encode_version(p, &index);
ei_encode_string_len(p, &index, buff, strlen(buff));
for (int i = 0; i < sizeof p; ++i)
printf("%d ", (unsigned char)p[i]);
printf("\n");

请注意,我们将 p 的大小增加了 1 个字节以保存版本魔数(Magic Number)。编译并运行这段代码会产生以下值,它与 term_to_binary 给我们的值完全匹配:

131 107 0 13 83 116 97 99 107 111 118 101 114 102 108 111 119

请注意,您可以通过使用 ei_x_... 函数变体进行编码来避免这些缓冲区大小问题,因为它们使用根据需要调整大小的动态缓冲区。

关于c++ - 使用 ei_encode_string 对字符串进行编码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37041093/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com