ASN.1 is made up of "encoding" of some chunk of data. An encoding is either:
|Identifier Octets|Length Octets|Contents (called the "Definite form")
|Identifier Octets|Length Octets|Contents|End of contets octets (called the "Indefinite form")
Definate form is in general used when you know the size of something before hand, indefinate form is used when the size of what you are encoding is unknown.
The Identifier Octets are built up like so: |1|2|3|4|5|6|7|8 ||Class|Constructed|||||Tag
where class is |Value|Class |00b|Universal |01b|Application |10b|Context specific |11b|Private
If constructed is 1, then it means that this is a constructed type, not a primative one.
The tag says which type it is, if the tag is under <=31, then it's value is used directly, otherwise the tag bits above are set to "11111" and then a sequence of octets that represent the number. The 8th bit of each octet is set to 1 to mean "more octets after this one". The low bits are the 7 bits of the tag, MSB first.
"Choice" values encode which choice was taken directly into the tag bits. I don't know why.
In definate encodings, if the 8th bit is 0, then it's a "short" encoding of the length, and the length is the lower 7 bits. If the 8th bit is set, and the lower 7 bits are how many octets are used to encode the length(!). This allows for lengths up to 2**1008. The lower 7 bits being set is reserved for future expansion.
End of contents is encoded as |Type|Length|Value |00|00| Absent
Boolean is encoded as an octet, 0 for false, non-zero for true. Integers are encoded as a sequence of bytes, MSB? first. Sequences are encoded as a series of encodings.