» »

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

Senitel ::

Jaz prebereš byte za bytom in izpisuješ enke in enice (kar koli je že smisel tega)...?

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č???

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).
Otroška radovednost - gonilo napredka.

Matthew ::

hja, to mi deluje pa malce nerazumljivo. Bi mi vedel povedat kaj več o tem 8 bit mask?

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

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?

Zgodovina sprememb…

  • spremenil: Matthew ()

CCfly ::

ja, to zdej vse štekam. Kako pa potem primerjam moj char z masko, oziroma kako masko uporabim?

#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

MaCoFaCo ::

Namesto operatorja && bi moral biti &

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.
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.
"My goodness, we forgot generics!" -- Danny Kalev

Zgodovina sprememb…

  • spremenilo: CCfly ()

Gundolf ::

Sam kritizerat znate ...

MaCoFaCo ::

Hehe

SasoS ::

Piši hex vrednosti. Konverzijo iz hex v binarno narediš na pamet...

Matthew ::

Mja, če bi znal pisat HEX vrednosti .... =/ ...

OwcA ::

Četudi ti ne znaš, kalkulator zna. ;)
Otroška radovednost - gonilo napredka.

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:

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

TemaSporočilaOglediZadnje sporočilo
TemaSporočilaOglediZadnje sporočilo
»

Logične operacije z biti (težka naloga)

Oddelek: Programiranje
111711 (1049) marjan_h
»

[C#] Operacija IN in ALI med dvema int številoma

Oddelek: Programiranje
111161 (974) LeQuack
»

Subnetting

Oddelek: Omrežja in internet
184457 (4226) Spc
»

iz binarne vrednosti v string

Oddelek: Programiranje
161834 (1469) Ktj
»

Program v C - nujno

Oddelek: Programiranje
171940 (1615) Ktj

Več podobnih tem