Avaleht
uus teema   vasta Tarkvara »  Programmeerimine »  C bitiväljade lugemine märgi kõik teemad loetuks
märgi mitteloetuks
vaata eelmist teemat :: vaata järgmist teemat
Hinnavaatlus :: Foorum :: Uudised :: Ärifoorumid :: HV F1 ennustusvõistlus :: Pangalink :: Telekavad :: HV toote otsing
autor
sõnum Saada viide sõbrale.  :: Teata moderaatorile teata moderaatorile
otsing:  
kalvis
Kreisi kasutaja

liitunud: 20.10.2009




sõnum 13.04.2014 11:06:20 C bitiväljade lugemine vasta tsitaadiga

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
vaata kasutaja infot saada privaatsõnum
troglodyte
Kreisi kasutaja
troglodyte

liitunud: 09.08.2002




sõnum 13.04.2014 20:25:26 vasta tsitaadiga

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
vaata kasutaja infot saada privaatsõnum mine selle kasutaja kodulehele
kalvis
Kreisi kasutaja

liitunud: 20.10.2009




sõnum 14.04.2014 12:44:12 vasta tsitaadiga

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
vaata kasutaja infot saada privaatsõnum
näita postitusi alates eelmisest:   
uus teema   vasta Tarkvara »  Programmeerimine »  C bitiväljade lugemine
[vaata eelmist teemat] [vaata järgmist teemat]
 lisa lemmikuks
näita foorumit:  
 ignoreeri teemat 
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.