簡體   English   中英

在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()返回之后, len將指示接收到的字節數,因此接收到的uint16_t值的數量將是接收到的字節數的一半:

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,您需要此代碼在混合CPU上正常工作(例如,將大端發送方發送到小端接收方,反之亦然),那么您將希望發送代碼轉換每個uint16_t發送到network / big-endian之前(通過htons() ),並讓您的接收代碼將每個接收到的uint16_t從network / big-endian轉換為其本地字節序(通過ntohs() )之后(但在嘗試將它們用於任何用途之前)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM