Ola pessoal,
Como eu acesso os bytes em torno de um ponteiro em linguagem C ?
[]`s
Ola pessoal,
Como eu acesso os bytes em torno de um ponteiro em linguagem C ?
[]`s
[quote=MaiqueL]Ola pessoal,
Como eu acesso os bytes em torno de um ponteiro em linguagem C ?
[]`s[/quote]
não entendi o “entorno”
supondo que seja um ponteiro para um array de bytes, vc pode ir pegando byte a byte somando 1 ao endereço do ponteiro, por exemplo, ou então fazer um memcpy tudo depende da sua necessidade
Como assim “em torno de um ponteiro”?
Você pode acessar os bytes apontados usando um cast:
double e = 1.23456789;
double *d = e;
unsigned char *p = (unsigned char*) d;
/* os bytes de p[0] até p[7] são os bytes do "double" que definimos na variável e. */
pois eh eu estou fazendo uns exercicios de linguagem C e a unica informacao que eu tenho eh a seguinte:
imprime os 8 bytes em torno de um ponteiro recebido como parâmetro, seguindo a seguinte estratégia de formação:
Se o byte pertencer ao range A…z, imprime o caracter ASCII correspondente, entre aspas simples, ocupando o espaço de 4 caracteres em tela.
Caso contrário, imprime o valor hexadecimal correspondente ao byte, ocupando 4 caracteres em tela.
[quote=entanglement]Como assim “em torno de um ponteiro”?
Você pode acessar os bytes apontados usando um cast:
double e = 1.23456789;
double *d = e;
unsigned char *p = (unsigned char*) d;
/* os bytes de p[0] até p[7] são os bytes do "double" que definimos na variável e. */
[/quote]
Eu sei que assim eu acesso os bytes de um endereco de memoria:
[code]
int inteiro =127;
int nbytes = sizeof(inteiro);
char* bytes = (char*) &inteiro;
for(i=0;i<nbytes;i++)
{
printf("\n valor do byte = %x \n",bytes[i]);
}[/code]
mas como acessar os 8 bytes em torno disso???
Olha, acho que esse exercício aí está bem esquisito(o enunciado está muito confuso). O inteiro ansi c tem 16 bits, char 8 bits.
Para acessar os bits de qualquer variável você precisa de uma “máscara” e usar o operador Shift (<< >>) para se movimentar entre eles.
ex:
[code]int val = 0x04;
if((val & 0xfe) == 1){ //verifica se é 1
//…
}else{ //se for zero
//…
}
val >>= 1; //move o bit mais significativo em uma posição a direita.
[/code]
Agora isso é uma outra coisa. Para saber se o valor pertence a tabela ascii você só precisa converter o byte para um valor inteiro. Você só precisa saber se o valor do caracter está dentro do intervalo da tabela.
int to_ascii(char c)
{
int a;
a=(int)c;
return(a);
}
Acho que tem que pegar os 4 bytes antes do endereço do ponteiro e os 4 depois
Para cada um desses bytes, imprime de acordo com a regrinha
[quote=gomesrod][quote=MaiqueL]
mas como acessar os 8 bytes em torno disso???
[/quote]
Acho que tem que pegar os 4 bytes antes do endereço do ponteiro e os 4 depois
Para cada um desses bytes, imprime de acordo com a regrinha[/quote]
Tah mas como eu acesso esses 4 bytes antes e os 4 bytes depois?
posta ai o codigo que faz isso, nao tenho a minima ideia de como fica isso.
Encontrei uma coisa na net que pode ajudar quem quizer algo parecido como me ajudou.
Por exemplo se eu tenho 32 bits em um int ponteiro ptr e executar ptr++ é conhecido como mover-se em 4 bytes na memória.
Agora ficou fácil fiquei com vergonha de ter postado.
[quote=MaiqueL]Encontrei uma coisa na net que pode ajudar quem quizer algo parecido como me ajudou.
Por exemplo se eu tenho 32 bits em um int ponteiro ptr e executar ptr++ é conhecido como mover-se em 4 bytes na memória.
Agora ficou fácil fiquei com vergonha de ter postado.[/quote]
mas isso só é verdade se o int tiver 4 bytes, você tem que olhar o limits.h aí do seu compilador para ter certeza, para intel/pc 32 bits normalmente é 4 bytes, mas para outras plataformas pode variar
então se eu tenho um ponteiro para int apontando para um array de ints se eu fizer ptr++ ele vai para a segunda posição do array, pq ele se move 4 bytes (o tamanho do int), por ser um int
se fosse um char, seria 1 byte, double 8 e assim por diante
[quote=MaiqueL]pois eh eu estou fazendo uns exercicios de linguagem C e a unica informacao que eu tenho eh a seguinte:
imprime os 8 bytes em torno de um ponteiro recebido como parâmetro, seguindo a seguinte estratégia de formação:
Se o byte pertencer ao range A…z, imprime o caracter ASCII correspondente, entre aspas simples, ocupando o espaço de 4 caracteres em tela.
Caso contrário, imprime o valor hexadecimal correspondente ao byte, ocupando 4 caracteres em tela.[/quote]
O objetivo do exercício é apenas imprimir o byte do caracter que se encontra no intervalo(A…z), caso não vc imprime em hexa. O enunciado ficou esquisito por causa desse “em torno”. Isso não existe.
Apontadores apontam para um endereço de memória e só.
Aliás, não se diz ponteiros, mas “apontadores”.
você só precisa converter o byte de um char em inteiro e comparar com os valores do intervalo.