Struktura w formacie Big-Endian

0

Witam.
Czy istnieje jakiś prosty patent na stworzenie struktury w formacie Big-Endian (oczywiście pod windowsa)

Chciałbym odczytać taką strukturę

struct log
{
	unsigned int TimeStamp;
	unsigned char TimeFloat;
	unsigned  char u1;
	unsigned  int ID;
	unsigned  char u2;
	unsigned  char u3;
	unsigned  short Cnt;
	unsigned  int Value;
}; 

I jedyne co wykombinowałem to to:

typedef unsigned int UINT;
typedef unsigned char UCHAR;

unsigned int main(UCHAR *d, UINT *TimeStamp, UINT *TimeFloat, UINT *u1, UINT *ID, UINT *u2, UINT *u3, UINT *Cnt, UINT *Val)
{
	*TimeStamp = (d[0]<<24)|(d[1]<<16)|(d[2]<<8)|(d[3]);
	*TimeFloat = d[4];
	*u1        = d[5];
	*ID        = (d[6]<<8)|(d[7]);
	*u2        = d[8];
	*u3        = d[9];
	*Cnt       = (d[10]<<8)|(d[11]);
	*Val       = (d[12]<<24)|(d[13]<<16)|(d[14]<<8)|(d[15]);
}

Jak widać nie wygląda to zbyt przyzwoicie i zastanawiam się czy nie da się tego ugryźć w jakiś lepszy sposób, bardziej czytelny i wydajny...

2

Ja bym sugerował wykorzystać fakt ze sieciowo bajty są big-endian i konwertował jakimś htons() / htonl()

0

W uzupełnieniu propozycji kolegi..

  1. Możesz jeszcze zrobić to unią która ma jak członka definicję struktury normalnie używanej oraz strukturę przygotowaną do pobrania w trybie BigEndian. Jest to technika (bardzo) niskopoziomowa i kod będzie wyglądał brzydko/bardzo brzydko. Lepiej jest to zrobić makrami transformacji danych do przesłania siecią.
  2. Możesz przygotować funkcje/zestaw funkcji które po otrzymaniu danych je "odwrócą" do formatu BigEndian. Funkcja taka przyjmie np. void * i ilość bajtów a zwróci także void * ale na dane przygotowane do przesłania jako BigEndian. Wiedząc ile bajtów masz przesłać, wyłuskasz dane... znów .. rzutowania na "brako-typ" void *. Taniec z brzytwą...
0

Najlepiej przewertować dokumentację framework-a, którego używasz, a w drugiej kolejności poszukać gotowych bibliotek.
Przykładowo jeśli używałbyś Qt to tam jest klasa QDataStream, która pozwala na kontrolowanie endiany i innych tego typu rzeczy.

Jeśli chcesz zrobić to sam, to najlepiej wprowadź kolejną warstwę i nie rób tego dla pojedynczych klas (tak jako to pokazałeś).

1 użytkowników online, w tym zalogowanych: 0, gości: 1