#include <stdio.h>
#include <stdint.h>
#include <string.h>
#include <inttypes.h>

union Str
{
   uint64_t a;
   char  str[8];
};

int main(void)
{
  union Str str;
  memcpy( &str.str, "12345678", sizeof(str.a));

  str.a = ((str.a & 0x0F000F000F000F00) >> 8  ) +
          ((str.a & 0x000F000F000F000F) *  10 );

  str.a = ((str.a & 0xFFFF0000FFFF0000) >> 16 ) +
          ((str.a & 0x0000FFFF0000FFFF) *  100 );

  str.a = ((str.a & 0xFFFFFFFF00000000) >> 32 ) +
          ((str.a & 0x00000000FFFFFFFF) *  10000 );
  //little-endian only. Можно переделать под big-endian

  printf("%"PRIu64, str.a);

return 0;
}