我想将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()
的帮助,数据大小不会受到影响。
谢谢!
答案 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()
)。