- 论坛徽章:
- 2
|
本帖最后由 cobras 于 2013-05-02 10:13 编辑
随手写了一个,没有文件测试。不适用于压缩的文件。- #include <stdlib.h>
- #include <stdio.h>
- int flash_file_get_bits_value(unsigned char *buff, int buff_len, int *io_offset, int *io_bit_index, int *io_bit_remain, int bits_len
- , unsigned long *o_value)
- {
- int bit_index, bit_remain;
- int offset;
- int value;
- offset = *io_offset;
- bit_index = *io_bit_index;
- bit_remain = *io_bit_remain;
- value = 0;
- while (bits_len > 0) {
- if (offset >= buff_len) {
- return -1;
- }
- if (bits_len >= bit_remain) {
- value <<= bit_remain;
- value |= buff[offset] & (1 << bit_remain);
- bit_remain = 8;
- bit_index = 7;
- ++offset;
- bits_len -= bit_remain;
- }else {
- value <<= bits_len;
- value |= (buff[offset] >> (bit_remain - bits_len)) & (1 << bits_len);
- bit_remain -= bits_len;
- bit_index -= bits_len;
- bits_len = 0;
- }
- }
- *io_offset = offset;
- *io_bit_index = bit_index;
- *io_bit_remain = bit_remain;
- if (o_value != NULL) {
- *o_value = value;
- }
- return 0;
- }
- int flash_file_get_size(unsigned char *buff, int len, unsigned long *o_left, unsigned long *o_right
- , unsigned long *o_top, unsigned long *o_botton)
- {
- int bits;
- int bits_index;
- int bits_remain;
- int byte_index;
- if (len >= 9) {
- bits = buff[8] >> 3;
- byte_index = 8;
- bits_index = 7 - 5;
- bits_remain = 8 - 5;
- if (flash_file_get_bits_value(buff, len, &byte_index, &bits_index, &bits_remain, bits, o_left) == 0) {
- if (flash_file_get_bits_value(buff, len, &byte_index, &bits_index, &bits_remain, bits, o_right) == 0) {
- if (flash_file_get_bits_value(buff, len, &byte_index, &bits_index, &bits_remain, bits, o_top) == 0) {
- if (flash_file_get_bits_value(buff, len, &byte_index, &bits_index, &bits_remain, bits, o_botton) == 0) {
- return 0;
- }
- }
- }
- }
- }
- return -1;
- }
- int flash_file_load(unsigned char **o_buff, int *o_buff_len, const char *file)
- {
- FILE *fp;
- long file_len;
- unsigned char *buf;
- fp = fopen(file, "rb");
- if (fp != NULL) {
- fseek(fp, 0, SEEK_END);
- file_len = ftell(fp);
- fseek(fp, 0, SEEK_SET);
- buf = (unsigned char *)malloc(file_len);
- if (buf != NULL) {
- if (fread(buf, file_len, 1, fp) == 1) {
- fclose(fp);
- *o_buff = buf;
- *o_buff_len = (int)file_len;
- return 0;
- }
- free(buf);
- }
- fclose(fp);
- }
- return -1;
- }
- int main(void)
- {
- unsigned char *buf;
- int buf_len;
- unsigned long left, right, top, botton;
- if (flash_file_load(&buf, &buf_len, "test.swf") == 0) {
- if (flash_file_get_size(buf, buf_len, &left, &right, &top, &botton) == 0) {
- printf("left: %lu\n", left);
- printf("right: %lu\n", right);
- printf("top: %lu\n", top);
- printf("botton: %lu\n", botton);
- free(buf);
- return 0;
- }
- free(buf);
- }
- return -1;
- }
复制代码 |
|