在C++中拆分32位值,并在MATLAB中连接块

Split up 32 bit value in C++ and concatenate the chunks in MATLAB

本文关键字:MATLAB 连接 并在 32位值 C++ 拆分      更新时间:2023-10-16

我正在做一个项目,我必须通过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位字符(存在这样的平台),那么一切都可以。