我正在努力解決嵌入式系統上的問題。我必須用 C 編程,這對我來說是一項艱巨的任務,因為我通常使用基于物件的編程語言。在這個系統中,兩個處理器共享記憶體并且它們處理資料的方式不同,我很確定這個問題與位元組序編碼有關,但是在嘗試創建一個函式來解決這個問題 3 小時失敗后,我正在尋求幫助。我在鑄造和指標處理方面苦苦掙扎。
情況:我在緩沖區中存盤了兩個(或更多)浮點數(或其他型別),讓我們在這個例子中說它的 {1.0f,1.0f}。如果另一個處理器根據輸入重新解釋它得到負數或高得離譜的指數數的資料,則最終會得到 {3F,80,00,00,3F,80,00,00} 的位元組表示。
那么我想要達到什么目的呢?修復此順序的函式,其中顛倒了位元組序編碼。
void fixEncoding(void *StoredData, uint8_t variableSizeInBytes, uint8_t buffer size)
引數將是指向我存盤的資料的指標 {3F,80,00,00,3F,80,00,00} 內編碼的變數的大小(例如,浮點數為 4 或 sizeof(float))和存盤的資料大小
input {3F,80,00,00,3F,80,00,00} , 4, 8
output{00,00,80,3F,00,00,80,3F}
input {3F,80,00,00,3F,80,00,00} , 2, 8
output{80,3f,00,00,80,3f,00,00}
uj5u.com熱心網友回復:
交換元素中的位元組是一種常見的習慣用法:您向上移動到一半的位元組并與對稱位元組進行交換。您只需逐個元素地將緩沖區迭代為位元組。
代碼可以是:
void fixEncoding(void* StoredData, uint8_t variableSizeInBytes, uint8_t buffer_size) {
char* data = StoredData; // must be char to be able to use pointer arithmetics
while (buffer_size > 0) {
int i;
// swap the element at data
for (i = 0; i < variableSizeInBytes / 2; i ) {
int j = variableSizeInBytes - i - 1;
char t = data[i];
data[i] = data[j];
data[j] = t;
}
// skip to next element
data = variableSizeInBytes;
buffer_size -= variableSizeInBytes;
}
}
uj5u.com熱心網友回復:
首先,您需要確定要成為通用位元組順序的位元組順序,然后確定緩沖區中的位元組是否應反轉。其中一個處理器已經float以這種通用位元組順序存盤 s,因此對于該處理器,您永遠不需要反轉緩沖區中的位元組。
我建議使用網路位元組順序只是因為有很多轉換為/從該格式轉換的示例。
我在這里使用htonl(host to network byte order for uint32_t) 來確定處理器是否已經在使用這個順序,但是還有更有效的方法。請參閱C 宏定義以確定大端或小端機器?.
例子:
#include <arpa/inet.h> // htonl
void swap_uint8_t(char *a, char *b) { // swap two bytes
uint8_t tmp = *a;
*a = *b;
*b = tmp;
}
void reverse(void *data, size_t len) { // reverse one `float` (or whatever you have)
uint8_t *s = data;
uint8_t *e = s len;
for(;s < e--; s) {
swap_uint8_t(s, e);
}
}
void fixEncoding(void *StoredData, uint8_t variableSizeInBytes, uint8_t buffer_size) {
if(htonl(1) != 1) { // determine if this machine is not using network byte order
// not network byte order, reverse each `float` (or whatever you have)
uint8_t *data = StoredData;
for(uint8_t pos = 0; pos < buffer_size; pos = variableSizeInBytes) {
reverse(data pos, variableSizeInBytes);
}
}
}
演示
這不是 100% 安全的,因為一些不常見的處理器使用混合位元組序。檢查你的沒有。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/410336.html
標籤:
