7 Bit ASCII to 8 Bit ASCII – C / C++ – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

7 Bit ASCII to 8 Bit ASCII – C / C++ – Fórum – Programujte.com7 Bit ASCII to 8 Bit ASCII – C / C++ – Fórum – Programujte.com

 

Toto vlákno bylo označeno za vyřešené — příspěvek s řešením.
Farrell0
Newbie
15. 10. 2012   #1
-
0
-

Mám problém... v tomhle mi to moc nemyslí, tak bych potřeboval poradit.

mám pole BYTE, které obsahuje 7Bit ASCII text a nemůžu přijít na to, jak to konvertovat do 8Bit. Vím, že by se měl asi použít nějaký bitový posun, ale tohle jde mimo mě..

Pro přiklad... 

AHOJ 8bit
BYTE str[] = { 01000001, 01001000, 01001111, 01001010}
/*
01000001
01001000
01001111
01001010
*/

AHOJ 7bit
BYTE str[] = {10000011, 00100010, 01111100, 00001010}
/*
10000011
00100010
01111100
1010
*/

Děkuji za případné rady..

Nahlásit jako SPAM
IP: 89.103.189.–
www.farpc.eu
liborb
~ Redaktor
+18
Guru
16. 10. 2012   #2
-
0
-

Možná, když si správně zapíšeš těch 7bitů, tak ti to docvakne:

AHOJ 7bit
BYTE str[] = {1000001, 1001000, 1001111, 1001010}
/*
10000011
00100010
01111100
1010
*/

Nebo pro ještě lepší představu ti to napíšu takto:

{01000001, 01001000, 01001111, 01001010}
{ 1000001,  1001000,  1001111,  1001010}
Nahlásit jako SPAM
IP: 188.75.135.–
kuto0
Newbie
16. 10. 2012   #3
-
0
-

Nejak takhle. Ale funguje to jen pro 8 vstupnich bytu. Nevim kolik prvku v tom poli budes mit. Ale pro ty 4 co jsi napsal to fungovat bude. A mas v ty ukazce chybu. Tech bytu v 8bitech bude 5, ne 4. ten posledni v tom 8bitovym poli mas spatne, nebo nerozumim co vlastne chces.

 V poli "decode" mas vysledek a "i" obsahuje pocet vyslednych bytu. Tady to bude vzdycky o 1 vic nez vstup.

unsigned char input[] = {0b10000011, 0b00100010, 0b01111100, 0b00001010};

unsigned char c, decode[9];
int shift = 1, mem = 0, i = 0;

for(unsigned int n = 0; n < sizeof(input); n++)
{
	decode[i++] = (input[n] >> shift) | (mem << 8 - shift);
	mem = input[n] % (int)pow(2, shift++);
}
decode[i++] = (mem << 8 - shift);
Nahlásit jako SPAM
IP: 212.158.130.–
Farrell0
Newbie
16. 10. 2012   #4
-
0
-

#2 liborb

Jenže já jsem to měl správně, nedělej ze mě vola :) To, že v poli BYTE je 7Bit ascii, neznamená, že v každém BYTE je 7bitů a nula... To bych pak nemusel konvertovat, protože by to bylo s ASCII 8Bit kompatibilní. Tam právě jde o ten posun!

Takže ano, je to tak, jak jsem psal...
 

AHOJ 7bit
BYTE str[] = {10000011, 00100010, 01111100, 00001010}
/*
10000011
00100010
01111100
1010
*/

#3 kuto

Tak asi si nebudu psát program, abych konvertoval slovo AHOJ, to bylo jen pro ukázku. Pracuji na analýze jednoho neveřejného komunikačního protokolu, kde běžný chat se řeší 7bit ASCII. Tudíž u krátkého slova AHOJ bude mít to pole stejně prvků. A nestačí mi něco, co bude fungovat do 8 pole, mám i pole s velikostí 150... Zkusím ještě něco dát do kupy. Jinak díky za příklad.

Jinak to další, co by měli tendenci říkat, že v ukázce je chyba - ne, není.

Nahlásit jako SPAM
IP: 89.103.189.–
www.farpc.eu
16. 10. 2012   #5
-
0
-

#4 Farrell
Pokoušíš se dekodovat PDU? 

hu

Nahlásit jako SPAM
IP: 195.178.67.–
16. 10. 2012   #6
-
0
-

takto se kódují sms když se používá jen anglická abeceda. V 7 bytech je 8 znaků, využívá se toho, že 8 bit je vždy 0. Najdi si něco o 7-bitovém šifrování. Kdysi jsem to dělal v assembleru na 8051. Jen 256 byte paměti, to byl masakr

hu

Nahlásit jako SPAM
IP: 195.178.67.–
16. 10. 2012   #7
-
0
-
Nahlásit jako SPAM
IP: 195.178.67.–
Farrell0
Newbie
16. 10. 2012   #8
-
0
-

No zkusil jsem něco zesmolit sám, ale je tam nějaký bug, který po určité sekvenci komolí písmeno...

VS C++ 2010
http://farpc.eu/zdrojak7bit.zip

Moje chyba - špatně jsem konvertoval text do 7Bit :) takže program je OK

Nahlásit jako SPAM
IP: 89.103.189.–
www.farpc.eu
Řešení
Farrell0
Newbie
16. 10. 2012   #9
-
0
-
Vyřešeno Nejlepší odpověď

Takhle jsem to vyřešil:


BYTE* Convert7BIT( BYTE *input, int count, int &NewCount )
{
	NewCount = (count*8)/7;
	if(NewCount < (float)(count*8)/7)
		NewCount++;

	BYTE *output = new BYTE[NewCount+1];

	for(int i=0;i<count;i++)
		output[i] = input[i];

	for(int pos=0; pos < NewCount; pos++)
	{

		BYTE puvodni = output[pos];
		BYTE prebyvajici;
		
		for( int xpos=pos+1; xpos < NewCount; xpos++)
		{
			if(getBit(7,puvodni))
				prebyvajici = 128;
			else
				prebyvajici = 0;

			puvodni = output[xpos];

			output[xpos] = (output[xpos] >> 1) | prebyvajici;
		}
		output[pos] = output[pos] >> 1;
	}

	return output;
}



void PrintByte( BYTE bity )
{
	//printf("b");
	BYTE x = 128;
	for(int i=0; i < 8; i++ )
	{
		if(bity&x)
		   printf("%d", 1);
		else
		   printf("%d", 0);
		   
		x = x/2;
	}
	//printf("\n");
}

/*BYTE getBit(int pos, BYTE *str)
{
	return str[pos / 8] & (1<<(8 - pos % 8));
}*/


BYTE getBit(int pos, BYTE str)
{
	if(pos>8)
	{
		printf("WARNING: getBit - pos > 8\n");
		return 0;
	}
	BYTE x=128;
	for(int i=0; i < pos; i++ )
		x=x/2;
		
	if(str&x)
		return 1;
	else
		return 0;
}
Nahlásit jako SPAM
IP: 89.103.189.–
www.farpc.eu
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, 58 hostů

Podobná vlákna

Převod 15-bit RGB na 24-bit RGB — založil PiranhaGreg

S bit — založil Koudis

16 bit compiler — založil Johanka z Jarku

Lazarus 64bit + 32 bit — založil Borisek

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ý