Skip to content

Instantly share code, notes, and snippets.

@R2ZER0
Created December 2, 2014 22:54
Show Gist options
  • Save R2ZER0/50a53aa810353c7055cc to your computer and use it in GitHub Desktop.
Save R2ZER0/50a53aa810353c7055cc to your computer and use it in GitHub Desktop.
something like a crc calculator?
#include <stdlib.h>
#include <stdio.h>
#include <stdint.h>
typedef struct {
unsigned long val : 48;
} uint48;
uint48 add48(uint48 a, uint48 b)
{
uint48 c;
c.val = a.val + b.val;
return c;
}
uint48 mul48(uint48 a, uint48 b)
{
uint48 c;
c.val = a.val * b.val;
return c;
}
const uint48 ZERO = { 0 };
const uint48 ONE = { 1 };
uint48 pow48(uint48 a, unsigned int by)
{
if(by == 0) {
return ONE;
} else {
uint48 accum = a;
while(by-- > 1) {
accum = mul48(accum, a);
}
return accum;
}
}
uint48 p(uint48 a) {
uint48 r = ZERO;
r = add48(r, pow48(a, 32));
r = add48(r, pow48(a, 26));
r = add48(r, pow48(a, 23));
r = add48(r, pow48(a, 22));
r = add48(r, pow48(a, 16));
r = add48(r, pow48(a, 12));
r = add48(r, pow48(a, 11));
r = add48(r, pow48(a, 10));
r = add48(r, pow48(a, 8));
r = add48(r, pow48(a, 7));
r = add48(r, pow48(a, 5));
r = add48(r, pow48(a, 4));
r = add48(r, pow48(a, 2));
r = add48(r, pow48(a, 1));
r = add48(r, pow48(a, 1));
return r;
}
void main(void)
{
uint48 a;
unsigned long temp;
scanf("%lx\n", &temp);
printf("Got %lX\n", temp);
a.val = temp;
uint48 r = p(a);
printf("CRC %lX\n", r.val);
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment