def Literal(C, is_unicode=False, needs_header=False, explicit_length=None, **kw): '''Read a string literal (ASCII/Unicode, with/without header).''' from bytecleaver import array_t, array_f, WORD, BYTE # Figure out our element type/size and length (if any) length = explicit_length if needs_header: C.skip(-4) data_type, byte_length = parse_data_header(C) is_unicode = (sizeof_data_type(data_type) == 2) length = byte_length / sizeof_data_type(data_type) # Read the raw data accordingly element = WORD if is_unicode else BYTE data = array_f(element, length)(C, **kw) if (length is not None) else array_t(element, 0)(C, **kw) # Convert to a string return (u''.join(map(unichr, data))) if is_unicode else (''.join(map(chr, data)))
def Identifier(C, **kw): '''Get a packed, NUL-terminated Identifier string.''' from bytecleaver import array_t, BYTE return decode_identifier(array_t(BYTE, 0)(C, **kw))