将字符串、整数和浮点数序列化为字符数组,以便在没有库的情况下进行网络连接

2023-11-26

我想通过网络传输数据,但我不想使用任何外部库(标准C/C++就可以)。

例如:

unsigned int x = 123;
char y[3] = {'h', 'i', '\0'};
float z = 1.23f;

我想要这个

char xyz[11];

array.

笔记: 为了通过网络传输它,我需要 unsigned int (htonl 函数)的网络字节顺序,然后我需要以某种方式将浮点数序列化为 IEEE 754 形式(互联网上有很多函数),我知道这一点。

如何将它们放入 xyz 数组中,首尾相连,以便我可以将其用作套接字 + send() 函数的缓冲区?显然我有反向函数(ntohl 和反向 IEEE 754)来将它们取出,但我也需要一种技术,最好是相同的......

它会是这样的:



xyz in binary: 
00000000 0000000 00000000 01111011 | 01101000 | 01101001 | 00000000 | 00111111 10011101 01110000 10100100
- big endian repr. of u. int 123 - | - 'h'  - | - 'i'  - | - '\0' - | -   IEEE 754 repr of float 1.23   -
  

在没有外部库和最少使用标准库函数的情况下如何实现这一目标?这与其说是为了我的程序,不如说是为了我学习。


啊,你想序列化原始数据类型!原则上,有两种方法:第一种方法是,您只需获取要序列化的数据的内部内存中二进制表示形式,将其重新解释为字符,然后将其用作表示形式:

所以如果你有:

双 d;

您获取该地址,将该指针重新解释为指向字符的指针,然后使用这些字符:

double *pd=&d;
char *pc = reinterpret_cast<char*>(pd); 
for(size_t i=0; i<sizeof(double); i++) 
{
   char ch = *pc;   
   DoSomethingWith(ch);   
   pc++;
}

这适用于所有原始数据类型。这里的主要问题是,binray 表示依赖于实现(主要依赖于 CPU)。 (当您尝试使用 IEEE NAN 执行此操作时,您会遇到微妙的错误...)。

总而言之,这种方法根本不可移植,因为您根本无法控制数据的表示。

第二种方法是使用您自己可以控制的更高级别的表示。如果性能不是问题,您可以使用 std::strstream 以及 >> 和

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

将字符串、整数和浮点数序列化为字符数组,以便在没有库的情况下进行网络连接 的相关文章

随机推荐

  • 包含非自反元素的集合的比较

    在Python中 一个值x并不总是被限制为等于自身 也许最著名的例子是NaN gt gt gt x float NaN gt gt gt x x False 现在考虑仅包含一项的列表 我们可以考虑两个这样的列表equal当且仅当它们包含的物
  • 在 C# 中使用 Linq 或 lambda 从数据库表中获取 X 个随机元素

    我有一个包含 x 个用户的数据库 我想随机获取所有用户 然后在我的网站上写下 50 个用户 现在我只使用 take 50 并检索最新 50 个用户 我希望它从整个表中随机洗牌 50 个 有什么想法吗 这就是我的代码现在的样子 userLis
  • %r 是什么意思?

    是什么意思 r在下面的声明中 print r 1 我想我听说过 s d and f但从未听说过这个 背景 在Python中 有两个内置函数用于将对象转换为字符串 str vs repr str应该是一个友好的 人类可读的字符串 repr应该
  • 防止 JSPX 创建自关闭标签 (
    !=

    JSPX 有一个可爱的旋转副作用 div class magic div Into div class magic div 对于许多浏览器来说 即使它是有效的 XHTML 这也会导致布局混乱 因此 我求助于使用 groovy 脚本通过以下正
  • jQuery DataTables 渲染列数据

    我正在使用 jQuery DataTables 显示来自 JSON 编码的 PHP 响应的信息 JSON 响应包含对象 名称 姓名 包含 全名 姓氏 ID 我一直在使用columns以我想要的方式显示数据 但是我遇到了一个我无法弄清楚的问题
  • 如何使用 wallet:accounts:read 请求访问所有用户帐户?

    当我的应用程序请求时wallet accounts read permission使用 Coinbase API v2 用户会看到一个包含所有帐户的下拉列表 他只能在三个可能的钱包中选择一个 如果我的应用程序想要与所有三个钱包 例如 BTC
  • Python:为什么(“hello”是“hello”)评估为True? [复制]

    这个问题在这里已经有答案了 为什么 hello is hello 生产True在Python中 我读了以下内容here 如果两个字符串文字相等 则它们已被置于相同的位置 内存位置 字符串是一个不可变的实体 没有伤害可以 做完了 那么每个 P
  • 添加列之前如何检查列是否存在

    我有一个数据库 如果它不存在 我想向其中添加一列 如何使用 sqlite swift API 做到这一点 通常 如果要向现有表添加新列 您将需要一个迁移路径 您可以使用userVersion管理数据库架构版本的属性 if db userVe
  • 一个用于验证美国和加拿大邮政编码的正则表达式

    我正在开发一个文具程序 客户可以选择美国或加拿大地区 当他们输入地址时 必须输入邮政编码 我正在尝试验证字段 但我无法对美国或加拿大使用 reg exp 我需要一个可验证两个国家 地区邮政编码的正则表达式 不知道您使用的是什么语言 我不会使
  • 垂直对齐属性如何工作?

    我不明白什么时候vertical align会和不会工作 每次我遇到一个用例vertical align至于它是否真的有效 这似乎是一个抛硬币的问题 我知道它必须应用于内联元素 我读到我必须指定一个line height对于通常没有的元素
  • Echoprint iOS 缺少框架

    有人下载过 EchoPrint 的 iOS 演示版本吗 它是一个音频指纹开源软件 我刚刚下载了它 但它似乎缺少框架 有什么地方可以获得功能版本吗 按照步骤使其框架运行 下载最新版本boost 下载link最新 1 51 0 的 boost
  • 无法启动 GlassFish 4.0 (Windows) - 端口 1527 - 地址已在使用中

    我是 Java EE 7 的新手 我有 Netbeans 7 4 GlassFish 4 0 和 Java EE 7 在 64 位 Windows 8 1 Pro 计算机中 我想要启动 GlassFish 4 0 Server 因此单击 N
  • 如何使用 Ramda 实现使用无点递归来删除对象中的空值?

    我正在学习 pointfree 函数 并尝试以这种风格实现这个递归空值删除器 有效 但是是not无点 function removeNulls obj return R ifElse R either R is Array R is Obj
  • 如何使用mongoose在mongodb中存储图像?

    任何人都有一个使用 mongoose 和 Nodejs Express 在 mongodb 中插入图像的快速示例 我读了一些例子 但我不明白如何做到这一点 我想以表格形式上传图片 app post videos new function r
  • Emacsclient 钩子上的kill

    我试图在 Emacs 中找到一个钩子 它应该在 emacs 服务器正常关闭之前触发 我尝试使用 elisp 来执行kill emacs query functions kill emacs hook server done hook 如下所
  • 如何在打乱的连续整数数组中查找重复元素?

    我最近在某处遇到一个问题 假设您有一个包含 1001 个整数的数组 整数按随机顺序排列 但您知道每个整数都在 1 到 1000 含 之间 此外 除了一个数字出现两次之外 每个数字在数组中只出现一次 假设您只能访问数组的每个元素一次 描述一种
  • JavaScript内部方法实现源码

    有没有办法查看 JavaScript 方法背后的代码 不是网站 html 或 js 文件中的 javascript 方法 而是 JavaScript 的内部方法 例如 我怎样才能看到JavaScript如何计算offsetTop一个元素的
  • MySQL DATETIME DIFF 查询

    我有一个 MySQL 查询 每 30 分钟通过 cron 运行一次以删除旧的属性列表 查询是 DELETE FROM wpdb gt posts WHERE post type rentals AND DATEDIFF NOW post d
  • 在 vuejs2 数据中动态插入子组件(无需 $compile 或滥用 v-html)

    我想在不一定是预定义的 HTML 块中的任意点动态插入新的 vuejs 组件 这是一个稍微做作的示例 演示了我正在尝试做的事情 Vue component child pretend I do something useful templa
  • 将字符串、整数和浮点数序列化为字符数组,以便在没有库的情况下进行网络连接

    我想通过网络传输数据 但我不想使用任何外部库 标准C C 就可以 例如 unsigned int x 123 char y 3 h i 0 float z 1 23f 我想要这个 char xyz 11 array 笔记 为了通过网络传输它