-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathbytecode_reader.c
59 lines (53 loc) · 1.41 KB
/
bytecode_reader.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
//
// Created by zhoubing on 2017/6/12.
//
#include <memory.h>
#include <stdlib.h>
#include "bytecode_reader.h"
uint8_t vm_read_8bit (struct vm_bytecode_reader *reader)
{
uint8_t val = 0;
memcpy(&val, reader->buf + reader->index, sizeof (uint8_t));
//reader->buf += sizeof(uint8_t);
val &= 0xff;
reader->index += sizeof (uint8_t);
return val;
}
uint16_t vm_read_16bit (struct vm_bytecode_reader *reader)
{
uint16_t val = 0;
uint8_t high = vm_read_8bit (reader);
uint8_t low = vm_read_8bit (reader);
val |= low;
val |= high << 8;
val &= 0xffff;
return val;
}
uint32_t vm_read_32bit (struct vm_bytecode_reader *reader)
{
uint32_t val = 0;
uint16_t high = vm_read_16bit (reader);
uint16_t low = vm_read_16bit (reader);
val |= low;
val |= high << 16;
val &= 0xffffffff;
return val;
}
uint8_t *vm_read_bytes (struct vm_bytecode_reader *reader, int bytes)
{
size_t len = bytes * sizeof (uint8_t);
uint8_t *str = (uint8_t *) malloc (len);
//指针指向原数据还是重新分配内存拷贝出来?
memcpy(str, reader->buf + reader->index, len);
reader->index += len;
return str;
}
struct vm_bytecode_reader *new_bytecode_reader (char *bytecode, uint32_t len)
{
struct vm_bytecode_reader *reader = malloc (sizeof (struct vm_bytecode_reader));
memset (reader, 0x00, sizeof (struct vm_bytecode_reader));
reader->buf = bytecode;
reader->size = len;
reader->index = 0;
return reader;
}