ref: fa95531388c81f253b2ad21c26272002463b7692
dir: /sys/src/libmp/port/betomp.c/
#include "os.h" #include <mp.h> #include "dat.h" // convert a big-endian byte array (most significant byte first) to an mpint mpint* betomp(uchar *p, uint n, mpint *b) { int m, s; mpdigit x; if(b == nil){ b = mpnew(0); setmalloctag(b, getcallerpc(&p)); } // dump leading zeros while(*p == 0 && n > 1){ p++; n--; } // get the space mpbits(b, n*8); b->top = DIGITS(n*8); m = b->top-1; // first digit might not be Dbytes long s = ((n-1)*8)%Dbits; x = 0; for(; n > 0; n--){ x |= ((mpdigit)(*p++)) << s; s -= 8; if(s < 0){ b->p[m--] = x; s = Dbits-8; x = 0; } } return b; }