Most data is numerical. For that, use WRITE_BYTE if the size of the field is 1, WRITE_SHORT if the size of the field is 2, and WRITE_LONG if the size of the field is 4.
Strrefs are numerical and can be written with WRITE_LONG, but that's only if the text you want is already in the game and you know its strref. Using SAY to insert the strref of text you provide is much more common.
For bit fields (like flags), that's a single number comprised of a number of bits used to store multiple pieces of information at once. You write to that the same as to other numbers, but there are special commands to help you set and retrieve individual bits. If no bits are set, the value of the number is 0. If you want to set just bit 2, you can use the built-in WeiDU variable BIT2 (e.g. WRITE_LONG 0x10 BIT2). If you want to set multiple bits, you can perform a bitwise OR, so to set bits 2 and 3, you would use WRITE_LONG 0x10 (BIT2 | BIT3) or the longer WRITE_LONG 0x10 (BIT2 BOR BIT3). For more information on bitwise operations, check out
this tutorial.
For textual data (like 'CRE ' or 'V1.0'), use WRITE_ASCII. The signature field might be read by something to determine what sort of file it is, so I would not leave that blank.
For the types you listed, "char array" is text. There are some places where "char" is used to mean single bytes of numerical data, so don't get confused by that. The 4*100 (strref*100) is not a single field, it's 100 different fields, all of which are strrefs. If a byte/word is signed, it means it accepts negative values.
As a stylistic choice, I avoid using string delimiters for numerical data (e.g. I'd use WRITE_LONG 0x14 90 instead of WRITE_LONG 0x14 ~90~), but either way is fine.