2013-03-25 21 views
6

voglio testare un programma di rete fondamentalmente invia pacchetto a un server remoto utilizzando UDP/TCP voglio generare alcuni byte casuale flussi spero la funzione è comegenerare flusso di byte casuale con `C`

u_char* gen_rdm_bytestream(int num_bytes) 
{ 
    u_char* stream=malloc(num_bytes); 
    ..... 
    // here how to generate? 
    .... 
    return stream; 
    } 

grazie!

+1

Si consiglia di provare a utilizzare un l di serie funzione ibrary che restituisce numeri casuali –

+0

Dopo che la memoria 'malloc' è già' casuale' in un certo senso. Non è veramente casuale ma pieno di _trash_. Penso che dovrebbe essere sufficiente per i test, non penso che tu abbia bisogno di un generatore casuale cripto-forte. – maverik

risposta

6

Per ogni byte, è possibile chiamare una funzione di generatore di numeri casuali. Lo standard C fornisce la funzione rand. Prima di utilizzarlo, è necessario inizializzare la sequenza casuale con una chiamata a srand.

gen_rdm_bytestream potrebbe essere simile a qualcosa del genere:

#include <stdlib.h> 
#include <time.h> 

unsigned char *gen_rdm_bytestream (size_t num_bytes) 
{ 
    unsigned char *stream = malloc (num_bytes); 
    size_t i; 

    for (i = 0; i < num_bytes; i++) 
    { 
    stream[i] = rand(); 
    } 

    return stream; 
} 

srand ((unsigned int) time (NULL)); 

Dal stream non è firmato, se il valore restituito da rand è maggiore di UCHAR_MAX, lei sarà ridotto (modulo UCHAR_MAX). Pertanto si otterrà numeri pseudo-casuale compreso tra 0 e 255.

+0

se il 'nr' di' srand (nr) 'è fisso, allora i byte prodotti sono sempre gli stessi, qualunque sia la piattaforma, giusto? – user138126

+0

@ user138126: Non necessariamente, poiché ogni piattaforma non ha lo stesso generatore di numeri casuali. Tuttavia, l'uso della funzione 'time', ad esempio, risolverebbe il problema. – md5

+0

Puoi abbandonare rand() e srand() e usare arc4random() per ottenere un risultato migliore. –

1

Sì, avete int rand (void); funzione in C,

Restituisce un numero intero pseudo-casuale nell'intervallo compreso tra 0 e RAND_MAX. RAND_MAX è una costante definita in.

Questo numero è generato da un algoritmo che restituisce una sequenza di numeri apparentemente non correlati ogni volta che viene chiamato. Questo algoritmo utilizza un seme per generare la serie, che dovrebbe essere inizializzato a un valore distintivo utilizzando la funzione srand().

EDIT:

Come si sta commentando, ho scritto un codice per voi che può aiutare di dimostrare, Come usare rand(), il programma e la sua uscita sono:

#include <stdio.h>  
#include <stdlib.h> /* srand, rand */ 
#include <time.h>  
int main(){ 
int i=0; 
srand (time(NULL)); 
printf("Five rand numbers: \n"); 
for(i = 1; i <= 5; i++){ 
    printf("\n %d", rand()); 
} 
printf("Five rand numbersb between 2 to 5: \n"); 
for(i = 1; i <= 5; i++){ 
    printf("\n %d", (2 + rand()%4)); 
}  
return 1; 
} 

uscita:

Five rand numbers: 

1482376850 
1746468296 
1429725746 
595545676 
1544987577 

Five rand numbers, between 2 to 5: 

2 
5 
3 
4 
3 

Codepad Link

+1

questo è 'int', che sono 4 byte – user138126

+0

@ user138126 La dimensione' int' dipende dalla piattaforma in C.nel sistema Linux è per, è possibile controllare le sue dimensioni utilizzando sizeof (int) operatore –

+0

Voglio dire che ho bisogno di byte casuali, qui è unità a 4 byte casuali – user138126

0

Ecco una funzione generale per la produzione di valori interi casuali in un determinato intervallo:

#include <stdlib> 

/** 
* Assumes srand has already been called 
*/ 
int randInRange(int min, int max) 
{ 
    double scale = 1.0/(RAND_MAX + 1); 
    double range = max - min + 1; 
    return min + (int) (rand() * scale * range); 
} 

Sfruttando questo per creare senza segno char valori:

u_char randomByte() 
{ 
    return (u_char) randInRange(0, 255); 
} 

Quindi,

for (i = 0; i < numBytes; i++) 
    stream[i] = randomByte(); 
Problemi correlati