Převod ASCII čísla v paměti na int ? – C / C++ – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Převod ASCII čísla v paměti na int ? – C / C++ – Fórum – Programujte.comPřevod ASCII čísla v paměti na int ? – C / C++ – Fórum – Programujte.com

 

Toto vlákno bylo označeno za vyřešené.
Kevil0
Návštěvník
20. 8. 2018   #1
-
0
-

Potřeboval bych poradit, jak převést ASCI čísla, kterámám uloženo v paměti, nejsou ukončeno \0 !!!  např. "   80766". Znám jeho délku a pozici prvního znaku v paměti. Jde mi funkci, kterou pak budu volat v cyklu.

int ASCI_na_cislo(int ASCIdelka, int ASCIpozice)
{
	return stoi(reinterpret_cast<string*>(adresa));
}

adresa je 64bit adresa na začátek paměti ke které je potřeba přičíst pozici prvního znaku (ASCIpozice).

Příklad volání funkce z Main:

x = ASCI_na_cislo(8, 0) 

Případně provést koverzi pomocí stringstream class nebo sscanf() ?

Nahlásit jako SPAM
IP: 89.177.163.–
20. 8. 2018   #2
-
0
-

Jedna možnost je doplnit za zadaný řetězec ukončovací znak (ne vždy lze takto upravit obsah paměti), druhá možnost alokovat paměť aby se tam vešel řetězec vč. ukončovacího znaku a zkopírovat. Do třetice vytvořit proměnnou, nazvěme ji num a tu nastavit na nulu. Pak v každé iteraci cyklu num vynásobit 10 a přičíst cifru vyjádřenou přečteným znakem. Počet iterací cyklu je dán počtem znaků. Jdou tak i vynechat bílé znaky před číslem. Cyklus lze ukončit i v okamžiku, kdy se narazí na nečíselný znak.

scanf by mohl mít problém s chybějícím koncem řetězce.

A ta funkce bude mit prototyp int Prevod(char* misto, int pocet); Protože "adresa na začátek paměti" je ukazatel.

hu

Nahlásit jako SPAM
IP: 2001:af0:ffe4:85f4:3ce6:c...–
Kevil0
Návštěvník
20. 8. 2018   #3
-
0
-

#2 hlucheucho
Díky, tu nulu na konec mohu doplnit. Funkce by pak mohla vypadat takto: 

int Prevod(int pocet, __int64 misto)
{
	*(BYTE *)(misto + pocet) = 0x00;
	return stoi(*(CHAR*)((misto));
}


Visual Studio mi ale červeně podtrhlo "stoi" a ";" na konci řádku. Co je špatně ?

Nahlásit jako SPAM
IP: 89.177.163.–
KIIV
~ Moderátor
+43
God of flame
20. 8. 2018   #4
-
0
-

#3 Kevil
stoi ocekava std::string. Rovnou pouzij:   std::stoi( std::string((char*)&misto, (char*)(&misto) + pocet) );

Samozrejme je lepsi jeste zjistit, jestli se cele cislo prevedlo a taktez to haze vyjimky, pokud to nejde prevest vubec.

Nahlásit jako SPAM
IP: 46.135.105.–
Program vždy dělá to co naprogramujete, ne to co chcete...
Kevil0
Návštěvník
20. 8. 2018   #5
-
0
-

Už to funguje :-)
Funkce na převod

Int Prevod(__int64 ASCII_adresa, int ASCII_delka, int ASCI_pozice)
{
	*(BYTE *)(ASCII_adresa + ASCI_pozice + ASCII_delka) = 0x00;
	return atoi(reinterpret_cast<CHAR*>(ASCII_adresa + ASCI_pozice));
}

Cyklus pro úpravu 50 mil. řádků:

for (int i = 0; i < radku; i++)		//Cyklus pro úpravu dat
	{
		misto = adresa + (i * 125);		//Načteme ID
		x = Prevod(misto, 8, 0);
		*(DWORD *)(misto + 56) = x;		//a uložíme na pozici 56
	}
Nahlásit jako SPAM
IP: 89.177.163.–
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 13 hostů

Podobná vlákna

Převod z Ascii — založil Kronya

Prevod string na int — založil polenog

Převod string na int — založil Vojtěch

Převod TString do int — založil Garones

Moderátoři diskuze

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý