The byte alignment is permuted one byte forward for FITS to left justify the string value starting in column 12. A similar production routine might receive the desired number of bytes to permute as an argument.
unsigned exclude[13] = { 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f, 0x40, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f, 0x60 }; int offset = 0x30; /* ASCII 0 (zero) */ char_encode (value, ascii) unsigned int value; char *ascii; { int byte, quotient, remainder, ch[4], check, i, j, k; char asc[32]; for (i=0; i < 4; i++) { byte = (value << 8*i) >> 24; /* each byte becomes four */ quotient = byte / 4 + offset; remainder = byte % 4; for (j=0; j < 4; j++) ch[j] = quotient; ch[0] += remainder; for (check=1; check;) /* avoid ASCII punctuation */ for (check=0, k=0; k < 13; k++) for (j=0; j < 4; j+=2) if (ch[j]==exclude[k] || ch[j+1]==exclude[k]) { ch[j]++; ch[j+1]--; check++; } for (j=0; j < 4; j++) /* assign the bytes */ asc[4*j+i] = ch[j]; } for (i=0; i < 16; i++) /* permute the bytes for FITS */ ascii[i] = asc[(i+15)%16]; ascii[16] = 0; }