praegune kellaaeg 18.06.2025 07:46:28
|
Hinnavaatlus
:: Foorum
:: Uudised
:: Ärifoorumid
:: HV F1 ennustusvõistlus
:: Pangalink
:: Telekavad
:: HV toote otsing
|
|
autor |
|
kalvis
Kreisi kasutaja
liitunud: 20.10.2009
|
13.04.2014 11:06:20
C bitiväljade lugemine |
|
|
Nikerdan vaikselt TS videofailide kallal, et saaks tulevikus MPEG streamis seda otse lõigata. Paraku on TS stream big endianis, intel aga on little endianis. Kas C-s saab kuidagi mälu salvestamist ka sundida, et kasutaks Big Endiani?. Kuigi praegu asi toimib, et kasutan muutujatel _H ja _L ning nende poole pöördumisel swapin baidid ringi on see ikkagi üsna mitte ilus lugemine. Ja kui tahaks koodi kasutad Big Endian prosel, tuleb kood jälle ringi teha.
Teine imelik lisanäht oli ka bittide lugemisel - millegipärast bitiväljadele tehakse kah little endiani, nooremat bitti tuleb lugeda struktuuris just vanemast kohast, samas kui terve bait on õige.
N: header on sync, flags1:3,PID:13,flags2:4,CC:4 kokku 4 baiti, lugeda BIG Endianis
struct TS_header {uint8_t sync, PID_H:5,flags1:3,PID_L,CC:4,flags2:4;}; uint16_t PID=PID_L+256*PID_H; ja nii sai bitid õieti kätte (igaks juhuks sai lisatud atrribuut packed).
Momendil kõik kompileeritud Mingw -s. Eesmärk oleks BIg endianis struktuuri kasutada, kuid tundub, et vist ei saa?
|
|
tagasi üles |
|
 |
troglodyte
Kreisi kasutaja

liitunud: 09.08.2002
|
13.04.2014 20:25:26
|
|
|
Endianness-i saab C-s kindlaks teha ja sellepõhjal otsustada koodis kustpoolt baite lugema tuleb hakata, google ütleb kuidas.
_________________ ph'nglui mglw'nafh Cthulhu R'lyeh wgah'nagl fhtagn |
|
Kommentaarid: 34 loe/lisa |
Kasutajad arvavad: |
   |
:: |
0 :: |
0 :: |
34 |
|
tagasi üles |
|
 |
kalvis
Kreisi kasutaja
liitunud: 20.10.2009
|
14.04.2014 12:44:12
|
|
|
http://mjfrazer.org/mjfrazer/bitfields/ leidsin ülevaate. Nati sain asja paremaks, st pääsesin koodis lühemate teisendustega (pole vaja enam baidikaupa kokku liita andmeid). Kui defineerisin struktuuri:
typedef struct {
int CC:4,f_AFC:2,f_TSC:2;
int PID:13;
int f_TEI:1,f_PUSI:1,f_TP:1;
int sync:8;
} ts_header_t __attribute__ ((packed));
siis enne aadressi tegin header=__builtin_bswap32(header); ja keerukat viitadega mängimist (bswap tahab uint32_t tüüpi, mitte struktuuri), siis on intel prosel masinal kõik ühe matsuga õiged.
Ainult see võttis mõistuse, kui int välja asemel püüdsin struktuuris kasutada alguses uint8_t ja uint16_t siis oli struktuur kohe metsas ja luges bitivälja kohe valesti. Pidi olema mingi kompilaatorite erisoov.
|
|
tagasi üles |
|
 |
|
lisa lemmikuks |
|
|
sa ei või postitada uusi teemasid siia foorumisse sa ei või vastata selle foorumi teemadele sa ei või muuta oma postitusi selles foorumis sa ei või kustutada oma postitusi selles foorumis sa ei või vastata küsitlustele selles foorumis sa ei saa lisada manuseid selles foorumis sa võid manuseid alla laadida selles foorumis
|
|
Hinnavaatlus ei vastuta foorumis tehtud postituste eest.
|