Vydělávej až 160.000 Kč měsíčně! Akreditované rekvalifikační kurzy s garancí práce od 0 Kč. Více informací.
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.

Diskuze: Prevod Char textu do binarneho tvaru

Aktivity
Avatar
madewman
Člen
Avatar
madewman:6.3.2019 20:37

Nic.

Zkusil jsem: Nic.

Chci docílit: Snazim sa previest zadany text
char* text = "Hello world!"; do binarneho tvaru.

Odpovědět
6.3.2019 20:37
"Whether you think you can, or you think you can't - you're right."(Henry Ford)
Avatar
Lukáš
Tvůrce
Avatar
Odpovídá na madewman
Lukáš:6.3.2019 20:52

Zkus alespoň napsat, jak by jsi to řešil.. Když napíšeš, že jsi se ani nepokusil, tak ti tu většina ani radit nebude.. Takhle to (vypadá), že po někom chceš hotové řešení.

 
Nahoru Odpovědět
6.3.2019 20:52
Avatar
madewman
Člen
Avatar
madewman:6.3.2019 20:53

Asi takto len neviem čo s tím dalej ze ako dam text char to intu?

(const char* text){
    if(text == NULL)
        return NULL;
    int size = strlen(text);
    int binaryNum[8];
    char copy_text;
    strcpy(copy_text,text);
Editováno 6.3.2019 20:54
Nahoru Odpovědět
6.3.2019 20:53
"Whether you think you can, or you think you can't - you're right."(Henry Ford)
Avatar
DarkCoder
Člen
Avatar
Odpovídá na madewman
DarkCoder:6.3.2019 21:39

To si tomu moc nedal. Tvé řešení nemá hlavu ani patu. Chybně je úplně vše (od deklarace proměnných, ukončení bloku, použití správného argumentu funkce, a mnoho dalších).

Řešením je vytvoření funkce převádějící znak do jeho binární podoby a provést traversing (Tuto funkci aplikovat postupně na všechny znaky v daném řetezci).

#include <stdio.h>

void ch_to_bin(unsigned char c);

int main(void) {
        unsigned char str[] = "Hello world!";
        unsigned char *pstr = str;

        while (*pstr) ch_to_bin(*pstr++);

        return 0;
}

void ch_to_bin(unsigned char c) {
        int i;

        for (i = 7; i >= 0; i--) putchar((c & (1 << i)) ? '1' : '0');
}
Akceptované řešení
+20 Zkušeností
+2,50 Kč
Řešení problému
Nahoru Odpovědět
6.3.2019 21:39
"I ta nejlepší poučka postrádá na významu, není-li patřičně předána." - DarkCoder
Avatar
madewman
Člen
Avatar
Odpovídá na DarkCoder
madewman:6.3.2019 22:02

Nechápem čo robí to ta premenná c?

Nahoru Odpovědět
6.3.2019 22:02
"Whether you think you can, or you think you can't - you're right."(Henry Ford)
Avatar
DarkCoder
Člen
Avatar
Odpovídá na madewman
DarkCoder:6.3.2019 22:27

Proměnná c je formálním parametrem funkce ch_to_bin(), jejíž účelem je předat funkci znakový argument. Ten je získáván pomocí dereference ukazatele na znak, který obsahuje postupně adresy všech znaků ve vstupním řetězci.

Nahoru Odpovědět
6.3.2019 22:27
"I ta nejlepší poučka postrádá na významu, není-li patřičně předána." - DarkCoder
Avatar
madewman
Člen
Avatar
Odpovídá na DarkCoder
madewman:7.3.2019 6:01

Ok len aby sme sa pochopili.Program ,ktorý mám urobiť je takto je definovaná funkcia v ktorej má bežať daný kód na zmenu char do bin.Main je ukažkovy ,že ako sa vyplňa. ta funkcia.

unsigned char* bit_encrypt(const char* text){

}
int main(){
        char* encrypted;
        encrypted = bit_encrypt("Hello world!");
}
Editováno 7.3.2019 6:01
Nahoru Odpovědět
7.3.2019 6:01
"Whether you think you can, or you think you can't - you're right."(Henry Ford)
Avatar
DarkCoder
Člen
Avatar
Odpovídá na madewman
DarkCoder:7.3.2019 20:35

Pokud chceš s binární reprezentací řetězce dále pracovat, musíš ji někam uložit. Tedy alokuješ si prostor, aby se do něj vešla binární reprezentace celého řetězce. Poté binární reprezentaci každého znaku postupně ukládáš do tebou alokované paměti. Nakonec vrátíš z funkce ukazatel na začátek alokované paměti, což představuje začátek řetězce zapsaném v binární podobě. Vrácený ukazatel přiřadíš jinému ukazateli. Vypíšeš řetězec pomocí ukazatele a nakonec uvolníš alokovanou paměť.

#include <limits.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

unsigned char *str_to_bin(unsigned char *s);

int main(void) {
        unsigned char str[] = "Hello World!";
        unsigned char *p_binstr = NULL;

        p_binstr = str_to_bin(str);

        puts(p_binstr);

        free(p_binstr);

        return 0;
}


unsigned char *str_to_bin(unsigned char *s) {
        unsigned char *strbuff = NULL;
        unsigned char *p_str = s;
        int i, pos = 0;

        strbuff = (unsigned char *)malloc(CHAR_BIT * strlen(s) + 1);
        if (!strbuff) {
                fprintf(stderr, "Chyba alokace pameti.\n");
                exit(1);
        }

        while (*p_str) {
                for (i = 7; i >= 0; i--, pos++) {
                        *(strbuff + pos) = ((*p_str & (1 << i)) ? '1' : '0');
                }
                p_str++;
        }
        *(strbuff + pos) = '\0';

        return strbuff;
}

Můžeš si zachovat (lehce poupravit) funkci pro získání binární reprezentace znaku a tuto funkci používat pro funkci provádějící převod celého řetězce do binární podoby. Přístup bys pak prováděl pomocí ukazatele na funkci použitého jako argument funkce. Z důvodu efektivity je funkce převodu znaku do jeho binární podoby přímo implementována do funkce pracující s řetězcem.

Nahoru Odpovědět
7.3.2019 20:35
"I ta nejlepší poučka postrádá na významu, není-li patřičně předána." - DarkCoder
Avatar
madewman
Člen
Avatar
Odpovídá na DarkCoder
madewman:8.3.2019 18:30

Velmi pekne dakujem za pomoc. Mam otazku co robi ta funkcia CHAR_BIT?

Nahoru Odpovědět
8.3.2019 18:30
"Whether you think you can, or you think you can't - you're right."(Henry Ford)
Avatar
DarkCoder
Člen
Avatar
Odpovídá na madewman
DarkCoder:8.3.2019 19:18

CHAR_BIT je makro, nikoli funkce. Je definováno v knihovně limits.h a vyjadřuje z kolika bitů se byte skládá. Ne všechny architektury pracují v systému 1 byte = 8 bits.

Nahoru Odpovědět
8.3.2019 19:18
"I ta nejlepší poučka postrádá na významu, není-li patřičně předána." - DarkCoder
Avatar
DarkCoder
Člen
Avatar
Odpovídá na madewman
DarkCoder:8.3.2019 19:26

Program ovšem pracuje správně tam kde 1byte = 8 bits. Což je vidět z počtu iterací cyklu for.

Nahoru Odpovědět
8.3.2019 19:26
"I ta nejlepší poučka postrádá na významu, není-li patřičně předána." - DarkCoder
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 11 zpráv z 11.