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

时间:2018-05-26 21:07:04

标签: c unsigned short

我想将unsigned short的原始数组转换为字节数组,然后将其读回。目的是通过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()的帮助,数据大小不会受到影响。 谢谢!

1 个答案:

答案 0 :(得分:2)

由于您的数组包含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()返回后,len将指示收到的字节的数量,因此收到的uint16_t值的数量将是其中的一半:< / p>

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

另一个注意事项:上面的代码不能处理大端/小端转换。如果您可以保证发送方和接收方都将在具有相同字节序的CPU上运行,那么这不是问题。如果OTOH你需要这个代码在混合CPU中正常工作(即大端发送者发送到小端接收器,反之亦然),那么你想要让你的发送代码转换你的每个您的uint16_t发送给网络/大端之前(通过htons()),并让您的接收代码转换每个收到的uint16_t&#39;在收到它们之后(但在尝试将它们用于任何事情之前),从网络/大端到其本地端(通过ntohs())。