CARLA
 
载入中...
搜索中...
未找到
StringPubSubTypes.cpp
浏览该文件的文档.
1// Copyright 2016 Proyectos y Sistemas de Mantenimiento SL (eProsima).
2//
3// Licensed under the Apache License, Version 2.0 (the "License");
4// you may not use this file except in compliance with the License.
5// You may obtain a copy of the License at
6//
7// http://www.apache.org/licenses/LICENSE-2.0
8//
9// Unless required by applicable law or agreed to in writing, software
10// distributed under the License is distributed on an "AS IS" BASIS,
11// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12// See the License for the specific language governing permissions and
13// limitations under the License.
14
15/*!
16 * @file StringPubSubTypes.cpp
17 * This header file contains the implementation of the serialization functions.
18 *
19 * This file was generated by the tool fastcdrgen.
20 */
21
22#include <fastcdr/FastBuffer.h>
23#include <fastcdr/Cdr.h>
24
25#include "StringPubSubTypes.h"
26// 定义SerializedPayload_t类型别名,用于表示序列化后的负载数据类型,来自eProsima的相关命名空间
27using SerializedPayload_t = eprosima::fastrtps::rtps::SerializedPayload_t;
28// 定义InstanceHandle_t类型别名,用于表示实例句柄类型,同样来自eProsima的相关命名空间
29using InstanceHandle_t = eprosima::fastrtps::rtps::InstanceHandle_t;
30
31namespace std_msgs {
32 namespace msg {
33 // StringPubSubType类的定义,用于处理特定消息类型(这里是String类型)的发布/订阅相关操作
35 {
36 // 设置该类型的名称,用于标识消息类型
37 setName("std_msgs::msg::dds_::String_");
38 // 获取String类型的最大CDR序列化大小
39 auto type_size = String::getMaxCdrSerializedSize();
40 // 进行可能的子消息对齐操作,确保数据按照4字节对齐
41 type_size += eprosima::fastcdr::Cdr::alignment(type_size, 4);
42 // 计算最终的类型大小,加上4字节用于封装相关信息
43 m_typeSize = static_cast<uint32_t>(type_size) + 4;
44 // 判断String类型是否定义了键(用于标识实例等用途)
45 m_isGetKeyDefined = String::isKeyDefined();
46 // 根据String类型的键的最大CDR序列化大小来确定键缓冲区的长度,取较大值(自身大小或16字节)
47 size_t keyLength = String::getKeyMaxCdrSerializedSize() > 16 ?
49 // 分配键缓冲区内存
50 m_keyBuffer = reinterpret_cast<unsigned char*>(malloc(keyLength));
51 // 初始化键缓冲区内存内容为0
52 memset(m_keyBuffer, 0, keyLength);
53 }
54 // StringPubSubType类的析构函数,用于释放之前分配的键缓冲区内存
56 {
57 if (m_keyBuffer != nullptr)
58 {
59 free(m_keyBuffer);
60 }
61 }
62 // 序列化函数,将给定的数据对象(这里是String类型)序列化为可传输的负载格式(SerializedPayload_t)
64 void* data,
65 SerializedPayload_t* payload)
66 {
67 // 将传入的void*指针转换为String*类型指针,以便后续操作
68 String* p_type = static_cast<String*>(data);
69 // 创建一个FastBuffer对象,用于管理原始缓冲区,将payload的数据指针和最大大小传入
70 eprosima::fastcdr::FastBuffer fastbuffer(reinterpret_cast<char*>(payload->data), payload->max_size);
71 // 创建一个Cdr对象,用于执行序列化操作,传入FastBuffer以及相关的字节序和CDR格式设置
72 eprosima::fastcdr::Cdr ser(fastbuffer, eprosima::fastcdr::Cdr::DEFAULT_ENDIAN, eprosima::fastcdr::Cdr::DDS_CDR);
73 // 根据序列化对象的字节序设置负载的封装字节序标识(大端或小端)
74 payload->encapsulation = ser.endianness() == eprosima::fastcdr::Cdr::BIG_ENDIANNESS ? CDR_BE : CDR_LE;
75 // 先序列化封装相关的头部信息(比如字节序标识等)
76 ser.serialize_encapsulation();
77
78 try
79 {
80 // 调用String对象的serialize方法,将实际的数据内容序列化到Cdr对象管理的缓冲区中
81 p_type->serialize(ser);
82 }
83 catch (eprosima::fastcdr::exception::NotEnoughMemoryException& /*exception*/)
84 {
85 // 如果内存不足,序列化失败,返回false
86 return false;
87 }
88 // 获取序列化后的数据长度,并设置到负载对象的length成员中
89 payload->length = static_cast<uint32_t>(ser.getSerializedDataLength());
90 return true;
91 }
92 // 反序列化函数,将接收到的负载数据(SerializedPayload_t)转换回对应的String类型对象
94 SerializedPayload_t* payload,
95 void* data)
96 {
97 try
98 {
99 // 将传入的void*指针转换为String*类型指针,以便后续操作
100 String* p_type = static_cast<String*>(data);
101 // 创建一个FastBuffer对象,用于管理原始缓冲区,传入payload的数据指针和实际长度
102 eprosima::fastcdr::FastBuffer fastbuffer(reinterpret_cast<char*>(payload->data), payload->length);
103 // 创建一个Cdr对象,用于执行反序列化操作,传入FastBuffer以及相关的字节序和CDR格式设置
104 eprosima::fastcdr::Cdr deser(fastbuffer, eprosima::fastcdr::Cdr::DEFAULT_ENDIAN, eprosima::fastcdr::Cdr::DDS_CDR);
105 // 先反序列化封装相关的头部信息(比如字节序标识等)
106 deser.read_encapsulation();
107 // 根据反序列化对象的字节序设置负载的封装字节序标识(大端或小端)
108 payload->encapsulation = deser.endianness() == eprosima::fastcdr::Cdr::BIG_ENDIANNESS ? CDR_BE : CDR_LE;
109 // 调用String对象的deserialize方法,从Cdr对象管理的缓冲区中还原出实际的数据内容到String对象中
110
111 p_type->deserialize(deser);
112 }
113 catch (eprosima::fastcdr::exception::NotEnoughMemoryException& /*exception*/)
114 {
115 // 如果内存不足,反序列化失败,返回false
116 return false;
117 }
118
119 return true;
120 }
121 // 返回一个函数对象,该函数对象用于获取给定数据对象(String类型)序列化后的大小(包含封装信息)
123 void* data)
124 {
125 return [data]() -> uint32_t
126 {
127 // 计算并返回String类型对象序列化后的大小,包含4字节的封装信息
128 return static_cast<uint32_t>(type::getCdrSerializedSize(*static_cast<String*>(data))) +
129 4u /*encapsulation*/;
130 };
131 }
132 // 创建一个新的String类型对象,返回的是void*指针,方便在通用的接口中使用
134 {
135 return reinterpret_cast<void*>(new String());
136 }
137 // 删除之前创建的String类型对象,传入的是void*指针,需要先转换为String*类型再进行删除操作
139 void* data)
140 {
141 delete(reinterpret_cast<String*>(data));
142 }
143 // 获取给定数据对象(String类型)的键信息,用于实例标识等用途,填充到InstanceHandle_t中
145 void* data,
146 InstanceHandle_t* handle,
147 bool force_md5)
148 {
149 if (!m_isGetKeyDefined)
150 {
151 // 如果该类型未定义键获取方式,直接返回false
152 return false;
153 }
154
155 String* p_type = static_cast<String*>(data);
156 // 创建一个FastBuffer对象,用于管理键序列化的缓冲区,传入键缓冲区指针和键的最大CDR序列化大小
157 eprosima::fastcdr::FastBuffer fastbuffer(reinterpret_cast<char*>(m_keyBuffer),
159 // 创建一个Cdr对象,用于执行键的序列化操作,设置为大端字节序(这里可能是固定要求)
160 eprosima::fastcdr::Cdr ser(fastbuffer, eprosima::fastcdr::Cdr::BIG_ENDIANNESS);
161 // 调用String对象的serializeKey方法,将键相关信息序列化到Cdr对象管理的缓冲区中
162 p_type->serializeKey(ser);
163 if (force_md5 || String::getKeyMaxCdrSerializedSize() > 16)
164 {
165 // 如果需要使用MD5或者键的序列化大小超过16字节,则进行MD5计算
166 m_md5.init();
167 m_md5.update(m_keyBuffer, static_cast<unsigned int>(ser.getSerializedDataLength()));
168 m_md5.finalize();
169 for (uint8_t i = 0; i < 16; ++i)
170 {
171 handle->value[i] = m_md5.digest[i];
172 }
173 }
174 else
175 {
176 // 如果不需要MD5且键大小不超过16字节,直接将键缓冲区内容复制到InstanceHandle_t的value数组中
177 for (uint8_t i = 0; i < 16; ++i)
178 {
179 handle->value[i] = m_keyBuffer[i];
180 }
181 }
182 return true;
183 }
184 } //End of namespace msg
185} //End of namespace std_msgs
eprosima::fastrtps::rtps::InstanceHandle_t InstanceHandle_t
eprosima::fastrtps::rtps::SerializedPayload_t SerializedPayload_t
virtual eProsima_user_DllExport ~StringPubSubType() override
virtual eProsima_user_DllExport bool serialize(void *data, eprosima::fastrtps::rtps::SerializedPayload_t *payload) override
virtual eProsima_user_DllExport void deleteData(void *data) override
virtual eProsima_user_DllExport std::function< uint32_t()> getSerializedSizeProvider(void *data) override
virtual eProsima_user_DllExport bool deserialize(eprosima::fastrtps::rtps::SerializedPayload_t *payload, void *data) override
virtual eProsima_user_DllExport bool getKey(void *data, eprosima::fastrtps::rtps::InstanceHandle_t *ihandle, bool force_md5=false) override
eProsima_user_DllExport StringPubSubType()
virtual eProsima_user_DllExport void * createData() override
这个类表示用户在IDL文件中定义的结构体String。
eProsima_user_DllExport void deserialize(eprosima::fastcdr::Cdr &cdr)
这个函数使用CDR序列化反序列化对象。
Definition String.cpp:124
static eProsima_user_DllExport size_t getKeyMaxCdrSerializedSize(size_t current_alignment=0)
这个函数返回对象键的最大序列化大小 取决于缓冲区对齐。
Definition String.cpp:169
static eProsima_user_DllExport size_t getMaxCdrSerializedSize(size_t current_alignment=0)
这个函数返回对象的最大序列化大小 取决于缓冲区对齐。
Definition String.cpp:98
static eProsima_user_DllExport bool isKeyDefined()
这个函数告诉你这个类型是否定义了键
Definition String.cpp:177
eProsima_user_DllExport void serialize(eprosima::fastcdr::Cdr &cdr) const
这个函数使用CDR序列化序列化对象。
Definition String.cpp:117
static eProsima_user_DllExport size_t getCdrSerializedSize(const std_msgs::msg::String &data, size_t current_alignment=0)
这个函数返回数据的序列化大小 取决于缓冲区对齐。
Definition String.cpp:106
eProsima_user_DllExport void serializeKey(eprosima::fastcdr::Cdr &cdr) const
这个函数使用CDR序列化序列化对象的键成员。
Definition String.cpp:183