Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #define SIZE_OF_ARRAY(x) ((sizeof(x))/(sizeof(x[0])))
- typedef union
- {
- uint32_t bit32;
- double_t varDbl;
- }entropy_var_t;
- static double_t get_entropy(uint8_t const * p_src, size_t const buffer_size)
- {
- double_t ret_val = 0;
- entropy_var_t bins[UINT8_MAX];
- memset(bins, 0, sizeof(bins));
- /* Count occurance of each byte */
- for(uint32_t itr = 0; itr < buffer_size; itr++)
- {
- bins[p_src[itr]].bit32+=1;
- }
- for(uint32_t itr = 0; itr < SIZE_OF_ARRAY(bins); itr++)
- {
- bins[itr].varDbl = (double_t)bins[itr].bit32/(double_t)buffer_size;
- if(bins[itr].varDbl > 0.0)
- {
- double_t log2p_i = log2(bins[itr].varDbl);
- ret_val = ret_val + (bins[itr].varDbl * log2p_i);
- }
- }
- return -ret_val;
- }
- void test(void)
- {
- uint8_t test_string[] =
- {
- 0x0A, 0x0A, 0x0A, 0x0A, 0x0A,
- 0x0B, 0x0B,
- 0x0C,
- 0x0D,
- 0x0E
- };
- double_t test_entropy = get_entropy(&test_string[0], SIZE_OF_ARRAY(test_string));
- return;
- }
Add Comment
Please, Sign In to add comment