在C++中拆分32位值,并在MATLAB中连接块
Split up 32 bit value in C++ and concatenate the chunks in MATLAB
我正在做一个项目,我必须通过UART将32位的值发送到MATLAB,在那里我需要在MATLAB终端中打印它们。我通过将32位值拆分为8位值来实现这一点,就像这样(:
void Configurator::send(void) {
/**
* Split the 32 bits in chunks of 4 bytes of 8 bits
*/
union {
uint32_t data;
uint8_t bytes[4];
} splitData;
splitData.data = 1234587;
for (int n : splitData.bytes) {
XUartPs_SendByte(STDOUT_BASEADDRESS, splitData.bytes[n]);
}
}
在MATLAB中,我收到以下4个字节:
252
230
25
155
现在的问题是,如何恢复1234587
?
将大小为4的数组创建为uint8_t
是否正确?我还想指出,为了可读性,我使用了并集。如果我做错了,我会很高兴听到为什么!
您可以使用左移来恢复值
uint32_t value = (byte[3]<<24) + (byte[2]<<16) + (byte[1]<<8) + (byte[0]<<0);
尽量避免在这类事情上使用联合。它(原则上)是不可移植的,并且可能导致未定义的行为。而是这样写:
void Configurator::send(void) {
/**
* Split the 32 bits in chunks of 4 bytes of 8 bits
*/
uint32_t data = 1234587;
for (int n = 0; n<4; n++) {
unsigned char octet = (data >> (n*8)) & 0xFF;
XUartPs_SendByte(STDOUT_BASEADDRESS, octet);
}
}
uint32_t recieveBytes(
{
uint32_t result = 0;
for (int n = 0; n<4; n++)
{
unsigned char octet = getOctet();
uint32_t octet32 = octet;
result != octet32 << (n*8);
}
return result;
}
重点是,通过像这样移出字节,可以避免endianness的任何问题。屏蔽还意味着,如果两端都有32位字符(存在这样的平台),那么一切都可以。
相关文章:
- 在C++STL中是否有Polyval(Matlab函数)等价物?
- 当套接字连接断开时检测C/C++Unix
- 有可能在Armadillo中复制MATLAB circshift方法吗
- 使用 MATLAB 编码器生成C++代码:编译错误"undefined reference to `rgb2gray_tbb_real64'"
- 无法在windows上使用mingw将sqlite3与c连接
- 到连接组件算法的问题(递归)
- QTcpSocket在不阻塞GUI的情况下重新连接到服务器
- 无法在C++中建立与MySQL数据库的连接
- PC中的程序和PHONE中的本机描述应用程序之间的数据连接
- 在Qt Creator中,如何在连接到正在运行的进程后查看控制台输出
- 连接 dockerized 模型和 dockerized 数据库时出现"无法 SQLConnect"错误
- 使用 bfs 解决连接组件问题时得到错误的答案
- 在C++的两个字符串中连接以逗号分隔的唯一值
- 如何修复valgrind启动时的致命错误(与libc6-dbg和libc6-dbg:i386连接)
- 连接 MATLAB 和 Visual Studios 的问题
- 如何将 Matlab 与 Visual Studio 连接以进行实时数据交换?
- 如何在C++程序中连接 MATLAB 中构建的经过训练的神经网络
- 在C++中拆分32位值,并在MATLAB中连接块
- 连接qt和matlab时出错
- openCV vs matlab矩阵连接