Struktura w formacie Big-Endian

Struktura w formacie Big-Endian
SM
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 47
0

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

Chciałbym odczytać taką strukturę

Kopiuj
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:

Kopiuj
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...

Shalom
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Space: the final frontier
  • Postów: 26433
2

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

MO
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Tam gdzie jest (centy)metro...
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ą...
MarekR22
  • Rejestracja: dni
  • Ostatnio: dni
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ś).

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.