- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我不太明白使用 streambuf 相对于常规数组的优势。让我解释一下我的问题。我有一个使用 Rijndael 128 ECB + 一些简单密码加密的网络连接,用于加密小于 16 字节的剩余数据。数据包的结构为 length_of_whole_packet+operationcode+data。我必须实际复制 streambuf 中的所有数据,以便我可以应用解密算法?为什么要再制作一份我已有的数据拷贝?
我在发送数据时遇到了同样的问题。在安全模式下,数据包结构为 length_of_whole_packet+crc+data,其中 crc 和数据已加密。我可以做一些像 MakePacket(HEADER, FORMAT, ...) 这样的怪物,它会分配数组、格式化数据包、添加 crc 并加密它,但我想避免使用 vararg 函数。我不能使用结构,因为数据包具有动态长度,因为其中可以有数组或字符串。如果我使用 MakePacket(unsigned char opcode, &streambuf sb) 那么 crc 会再次出现问题 -> 必须制作一个拷贝来加密它。
我是否应该使用 vararg monstrosity 将常规数组作为缓冲区与 unsigned char pbyRecvBuffer[BUFFERMAXLEN] 结合用于接收?
我不太确定如何设计这种避免数据拷贝的通信。
谢谢你的回答。
最佳答案
使用 streambuf
时,通常可以通过使用对迭代器进行操作的算法来最小化数据复制,例如 std::istreambuf_iterator
或 boost::asio::buffers_iterator
,而不是将数据从 streambuf
复制到另一个数据结构中。
对于类似流的应用程序协议(protocol),boost::asio::streambuf
通常优于 boost::asio::buffer()
兼容类型,例如原始数组。例如,考虑 HTTP ,其中分隔符用于标识可变长度 header 和正文之间的边界。上级read_until()
操作提供了一种优雅的方式来读取协议(protocol),因为 Boost.Asio 将处理内存分配、检测定界符并在到达消息边界后调用完成处理程序。如果应用程序使用原始数组,则需要读取 block 并将每个碎片 block 复制到聚合内存缓冲区中,直到识别出适当的分隔符。
如果应用程序可以确定要读取的确切字节数,那么可能值得考虑对固定长度部分使用 boost::array
和使用 std::vector
对于可变长度部分。例如,具有以下内容的应用程序协议(protocol):
boost::array
。std::vector
读取固定大小的 header ,调整 vector
确定正文长度后,再阅读正文。在问题的上下文中,如果 length_of_whole_packet
是固定长度,应用程序可以将其读入 std::vector
,调整 vector
的大小code> 根据确定的主体长度,然后将剩余数据读入vector
。然后,解密算法可以直接在 vector
上运行,并使用输出迭代器,例如 std::back_insert_iterator
,如果算法不能在-地方。对要写入的数据进行加密也是如此。
关于c++ - asio::streambuf 优于原始数组的优势,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24328522/
首先对WCF与WebService的定义进行概括,接着介绍了WCF的优势,最后就是对WCF与WebService两者的根本区别进行比较,具体内容如下 1、定义 1.WebService:严格来
关闭。这个问题是opinion-based .它目前不接受答案。 想改善这个问题吗?更新问题,以便可以通过 editing this post 用事实和引文回答问题. 5年前关闭。 Improve t
关闭。这个问题是opinion-based .它目前不接受答案。 想要改进这个问题? 更新问题,以便 editing this post 可以用事实和引用来回答它. 关闭 8 年前。 Improve
谁能告诉我将下一个脚本标记放在 元素之后和将它放在 元素之前有什么好处? (function (){ var script = document.createElement("script"); s
我最近遇到了一个 JavaScript 脚本,其中作者似乎试图避免在代码中使用字符串并将所有内容都分配给一个变量。 所以代替 document.addEventListener('click', (e
Scott Meyers 在“Effective Modern C++”中说表达式 Matrix sum = m1 + m2 + m3 + m4 (其中所有对象的类型均为 Matrix)“如果 ope
按照目前的情况,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the
免责声明:我是网络开发的新手,所以请多多包涵... 堆栈:Angular 前端,后端的 Tornado(基于 python)网络服务器 我一直在使用 RxJs 和 WebSocket 成功地与后端通信
我一直在调查我的 Flutter 应用程序的 JSON 解析,并且有一个关于我无法解决的工厂构造函数的问题。我试图了解使用工厂构造函数与普通构造函数的优势。例如,我看到很多 JSON 解析示例,它们使
添加 SQL 后尝试打开 TadsQuery 时出现 5400 AE_INTERNAL_ERROR。当我将相同的 SQL 直接放在 TadsQuery 中时,没有错误。您的帮助文件指示我联系 Adva
关闭。这个问题是opinion-based .它目前不接受答案。 想改进这个问题?更新问题,以便 editing this post 可以用事实和引用来回答它. 8年前关闭。 Improve this
关闭。这个问题是opinion-based .它目前不接受答案。 想要改进这个问题? 更新问题,以便 editing this post 可以用事实和引用来回答它. 关闭 9 年前。 Improv
我想定义一个函数,当给定一个整数时,它将返回一个字符串。像这样: # Pseudocode function get_string(i) return my_string_array[i] end
我曾尝试在 Linux 和 Windows 上使用 DBD::Advantage,但没有成功。 Windows 版本附带了一个看似完整的安装程序,但它留下了 DBD-Advantage-8.10.ta
为什么说 NoSQL 在结构上比某些 SQL 数据库更快?假设我在某个 SQL 表的列上添加了一些索引。有人可以提供某种更快的查询吗? 我正在阅读有关 redis 的内容。 class User <
我的问题很简单:如果接口(interface)由单个类实现,那么使用接口(interface)有什么好处吗? 我一直认为只有当该接口(interface)有多个实现时,接口(interface)才是好
考虑这些(或多或少)等价的类型签名: f1 :: [a] -> Int -> a f2 :: Integral b => [a] -> b -> a f2 比 f1 更通用,这是一个很大的优势,但是
我们在 Scala 中部分应用了函数- def sum(a:Int,b:Int,c:Int) = a+b+c val partial1 = sum(1,_:Int,8) 我想知道使用部分应用函数的优点
你看下面的代码,我是如何使用 session 变量的;所以这三个问题是: 它们存放在哪里? (服务器或客户端) 它们对于每个网页访问者来说都是独一无二的吗? 我可以在完成工作后使用 ajax 或简单的
我知道这是一个常见问题,互联网上有关于此主题的资源,但我想从这个社区了解每个人在部署博客时对子域与子文件夹的想法(SEO 优势)。 谢谢。 最佳答案 我研究过一次,根据社区反馈以及权衡利弊,我会说去一
我是一名优秀的程序员,十分优秀!