Forum » Programiranje » [java ali C] Datoteka v obliki 0 in 1
[java ali C] Datoteka v obliki 0 in 1
Matthew ::
Moje vprašanje je pa tako: če se da na kakšn način odpret peč nek fajl z diska in njegovo vsebino dobit v obliki ničel in enic? V poštev bi pa pršla programska jezika java al pa C.
Matthew ::
hm, a ni tko, da če bereš bajt za bajtom, da ne dobivaš ničel in enic?
npr. v Cju, če uporabim:
FILE *datoteka;
datoteka = fopen("blabla", "rb");
while (!feof(datoteka))
{
znak = fgetc(datoteka);
}
pol "znak" ne bojo 0 in 1, ali pač???
npr. v Cju, če uporabim:
FILE *datoteka;
datoteka = fopen("blabla", "rb");
while (!feof(datoteka))
{
znak = fgetc(datoteka);
}
pol "znak" ne bojo 0 in 1, ali pač???
Zgodovina sprememb…
- spremenil: Matthew ()
OwcA ::
Ne znak bo osmero bitov.
Narediš si 8 bit mask in z vsako poskusiš, če kaj uloviš. Rezultat izpišeš ali nekam shraniš (recimo v niz boolov).
Narediš si 8 bit mask in z vsako poskusiš, če kaj uloviš. Rezultat izpišeš ali nekam shraniš (recimo v niz boolov).
Otroška radovednost - gonilo napredka.
Vesoljc ::
ponavadi ne moreš dostopati do posameznih bitov neke spremenljivke, v tem primeru recimo char, ki je velik en byte (8bitov), zato ker je to pravzaprav najmanjši kos pomnilnika s katerim lahko delaš.
en char z vrednostjo 0 zgleda nekak tko: 0000 0000
z vrednostjo 64 pa tkole: 0100 0000
upam da znaš binarno štet?
no in zdej uporabiš masko. recimo da hočeš ugotoviti ali je 5.bit enak 1
torej če bi rad izpisal posamezne bite, rabiš osem mask
0000 0000
0000 0001
0000 0010
0000 0100
itd...
če je rezultat ena, je n-ti bit enak 1.
pogugli za "bitwise operators"
en char z vrednostjo 0 zgleda nekak tko: 0000 0000
z vrednostjo 64 pa tkole: 0100 0000
upam da znaš binarno štet?
no in zdej uporabiš masko. recimo da hočeš ugotoviti ali je 5.bit enak 1
0100 1000 - vhodni podatki && 0001 0000 - maska ========= 0000 0000 - rezultat 1011 1001 && 0110 0001 ========= 0010 0001
torej če bi rad izpisal posamezne bite, rabiš osem mask
0000 0000
0000 0001
0000 0010
0000 0100
itd...
če je rezultat ena, je n-ti bit enak 1.
pogugli za "bitwise operators"
Abnormal behavior of abnormal brain makes me normal...
Matthew ::
ja, to zdej vse štekam. Kako pa potem primerjam moj char z masko, oziroma kako masko uporabim?
aja, pa še to - zakaj 8 mask? a ne bi blo potem uredu, če bi dal za masko kr 1111 1111 in bi mi povedal za vse naenkrat, kje so enice?
aja, pa še to - zakaj 8 mask? a ne bi blo potem uredu, če bi dal za masko kr 1111 1111 in bi mi povedal za vse naenkrat, kje so enice?
Zgodovina sprememb…
- spremenil: Matthew ()
CCfly ::
ja, to zdej vse štekam. Kako pa potem primerjam moj char z masko, oziroma kako masko uporabim?
aja, pa še to - zakaj 8 mask? a ne bi blo potem uredu, če bi dal za masko kr 1111 1111 in bi mi povedal za vse naenkrat, kje so enice?
Lahko vzameš poljubno masko, kjer preveriš, katere vrednosti so nastavljene na 1.
npr.:
#define MASK_B0 0x80 if(ch && MASK_B0 == 0) // prvi bit je enak 0
aja, pa še to - zakaj 8 mask? a ne bi blo potem uredu, če bi dal za masko kr 1111 1111 in bi mi povedal za vse naenkrat, kje so enice?
Lahko vzameš poljubno masko, kjer preveriš, katere vrednosti so nastavljene na 1.
npr.:
#define MASK_CUSTOM 0xAA if(ch && MASK_CUSTOM == 0) // biti b0, b2, b4 in b6 so enaki 0
"My goodness, we forgot generics!" -- Danny Kalev
OwcA ::
Ja in ch & MASK_B0 v oklepaj, ker ima operator == prednost pred &.
Otroška radovednost - gonilo napredka.
MaCoFaCo ::
Malo sem se poigral v C#
static void Main(string[] args)
{
WriteByteBinary(0xAA);
System.Console.ReadLine();
}
public static void WriteByteBinary(byte b)
{
byte mask = 0x80;
while (true)
{
int bit = (b & mask) > 0 ? 1 : 0;
System.Console.Write(bit);
if (mask == 1) break;
mask /= 2;
}
}
Gundolf ::
Da se tudi enostavneje, pa še LSB postaviš na prvo mesto (tako da bo dejansko sekvenca ničel in enic kot si sledijo v fajlu in ne le binarni zapis števila). Čeprav glede tega zadnjega bi lahko še bile polemike.
P.S. nisem siguren, če je to čista C koda.
void write01(char ch) { for (int i=0; i<8; ++i) { printf("%c", (ch & 1) > 0 ? '1' : '2'); ch >>= 1; } }
P.S. nisem siguren, če je to čista C koda.
Zgodovina sprememb…
- spremenil: Gundolf ()
CCfly ::
Uh n00b napake :(
P.S. nisem siguren, če je to čista C koda.
Že for zanka je C++ sintatični sladkor :)
edit: da ne bo pomote, mislil sem na int i=0 deklaracijo v for zanki.
P.S. nisem siguren, če je to čista C koda.
Že for zanka je C++ sintatični sladkor :)
edit: da ne bo pomote, mislil sem na int i=0 deklaracijo v for zanki.
"My goodness, we forgot generics!" -- Danny Kalev
Zgodovina sprememb…
- spremenilo: CCfly ()
Matthew ::
ne, sej hex vrednosti poznam in znam pretvarjat, ampak jst sm razumel, da nej v hex obliki programiram. to pa ne znam.
Mmm'Aah ::
"for (int i=0 ..." je "C++ koda, v C pa mora bit napoved spremenljivke izven definicije zanke: "int i; for(i=0 ..."
koda za izpis binarno:
koda za izpis binarno:
izpisi01(unsigned char *data, int size) { int i; for (i=0; i < size; i++) { unsigned char byte = data[i]; int mask=0x80; int j; for(j=0; j < 8; j++) { if(byte & mask) printf("1"); else printf("0"); mask >>= 1; } } }
Zgodovina sprememb…
- spremenilo: CCfly ()
Vredno ogleda ...
Tema | Ogledi | Zadnje sporočilo | |
---|---|---|---|
Tema | Ogledi | Zadnje sporočilo | |
» | Logične operacije z biti (težka naloga)Oddelek: Programiranje | 1711 (1049) | marjan_h |
» | [C#] Operacija IN in ALI med dvema int številomaOddelek: Programiranje | 1161 (974) | LeQuack |
» | SubnettingOddelek: Omrežja in internet | 4457 (4226) | Spc |
» | iz binarne vrednosti v stringOddelek: Programiranje | 1834 (1469) | Ktj |
» | Program v C - nujnoOddelek: Programiranje | 1940 (1615) | Ktj |