在C中将无符号短数组转换为字节数组

Converting unsigned short array to byte array in C

我想将原始的无符号短整型数组转换为字节数组,然后读回。目的是通过 SPI 缓冲区发送数据并在另一端读取。

示例:

发件人:

unsigned short array[10] = {65000, 0, 6000, 15000, 100, 50, 1000, 10, 5000, 2000};
const uint8_t *data = charArrayToByteArray(array); // <-- convert it ?
send(data, sizeof(data)); // send it

接收方:

uint8_t buf[10];
uint8_t len = sizeof(buf);  
receive(buf, &len); 
unsigned short array[10] = arrayByteToCharArray(buf); // convert it back ?

工作函数:

send(const uint8_t* data, uint8_t len); //function that sends the data
receive(uint8_t* buf, uint8_t* len); // function that receives the data

我需要 charArrayToByteArray()arrayByteToCharArray() 方面的帮助,而且数据大小不能受到影响。 谢谢!

由于您的数组包含 65000 等不能作为单个字节发送的值,因此可以合理地假设您打算将每个值作为两个字节发送。

鉴于此,数据值根本不需要转换;而只有指针的类型(这样 send() 调用才能编译)。所以这应该足够了:

unsigned short array[10] = {65000, 0, 6000, 15000, 100, 50, 1000, 10, 5000, 2000};
const uint8_t *data = reinterpret_cast<const uint8_t *>(array);
send(data, sizeof(array));

请注意,send() 调用指定的是 sizeof(array) 而不是 sizeof(data);由于 data 是一个指针,它的大小是 4 或 8 个字节(取决于您的 CPU 体系结构)并且与您要发送的数据字节数无关!

接收方类似:

uint16_t buf[10];
uint8_t len = sizeof(buf);  
uint8_t * data = reinterpret_cast<uint8_t *>(buf);
receive(data, &len); 

注意在receive()后returns,len会表示收到bytes的个数,所以[=20=的个数] 收到的值将是以下值的一半:

int numShortsReceived = len/sizeof(uint16_t);
for (int i=0; i<numShortsReceived; i++) printf("Received short #%i = %u\n", i, buf[i]);

另请注意:以上代码不处理 big-end/little-endian 转换。如果您可以保证发送方和接收方都将 运行 在具有相同字节顺序的 CPU 上,那不是问题。如果 OTOH 您需要此代码在 mixed-CPUs 中正常工作(即大端发送方发送到小端接收方,反之亦然),那么您需要发送代码在发送之前(通过 htons())将每个 uint16_t 转换为 network/big-endian,并让您的接收代码将每个收到的 uint16_t 从 network/big-endian 在收到它们之后(但在尝试将它们用于任何事情之前)到其本地字节序(通过 ntohs())。