免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12
最近访问板块 发新帖
楼主: abcbuzhiming
打印 上一主题 下一主题

[算法] 坑啊,求大牛设计个算法解这个问题 [复制链接]

论坛徽章:
0
11 [报告]
发表于 2013-04-30 20:41 |只看该作者
整一个long,把你的9~12字节放进去(注意你得一个字节一个字节的放,不然有可能顺序错),然后&F8FF取到最高的5位,取出的值[0]>>3,最高的5位就到了最低5位,可以直接拿来用了;再把你的long<<5,把取走的5位挤出去,记录下左移的次数5;然后再取你需要的下个数据,比如6位,取法还是一样的,单再次long左移的时候不一样了,你需要检测出再次左移的6位+上次的5位超出了8位,此时就必需先<<8,然后把13字节放到long[3]里,然后再<<3完成移位。     这整个功能可以封装到一个类里,就可以源源不断的取出指定位数的值。

论坛徽章:
13
CU大牛徽章
日期:2013-04-17 11:20:3615-16赛季CBA联赛之吉林
日期:2017-05-25 16:45:4715-16赛季CBA联赛之福建
日期:2017-03-13 11:33:442017金鸡报晓
日期:2017-02-08 10:39:422017金鸡报晓
日期:2017-01-10 15:13:29IT运维版块每日发帖之星
日期:2016-03-15 06:20:01IT运维版块每日发帖之星
日期:2015-10-02 06:20:00CU十二周年纪念徽章
日期:2013-10-24 15:41:34CU大牛徽章
日期:2013-09-18 15:15:45CU大牛徽章
日期:2013-09-18 15:15:15CU大牛徽章
日期:2013-04-17 11:46:39CU大牛徽章
日期:2013-04-17 11:46:28
12 [报告]
发表于 2013-04-30 21:22 |只看该作者
只能证明楼主C语言基础有问题,没有理解位运算。

论坛徽章:
36
CU大牛徽章
日期:2013-09-18 15:24:20NBA常规赛纪念章
日期:2015-05-04 22:32:03牛市纪念徽章
日期:2015-07-24 12:48:5515-16赛季CBA联赛之辽宁
日期:2016-03-30 09:26:4715-16赛季CBA联赛之北控
日期:2016-03-30 11:26:2315-16赛季CBA联赛之广夏
日期:2016-05-20 15:46:5715-16赛季CBA联赛之吉林
日期:2016-05-24 11:38:0615-16赛季CBA联赛之青岛
日期:2016-05-30 13:41:3215-16赛季CBA联赛之同曦
日期:2016-06-23 16:41:052015年亚洲杯之巴林
日期:2015-02-03 15:05:04CU大牛徽章
日期:2013-09-18 15:24:52CU十二周年纪念徽章
日期:2013-10-24 15:46:53
13 [报告]
发表于 2013-05-02 08:40 |只看该作者
回复 8# idi0t


        我可没说指针做位运算(不过指针类型本身也可以做位运算,可没意义),只是你说的flash解析用位运算很好实现,不懂的话你应该补补基础知识,而不是一种那样的语气,作为一名初学者,我每次回答别人的帖子都是思考过的。

论坛徽章:
1
技术图书徽章
日期:2013-09-10 08:57:55
14 [报告]
发表于 2013-05-02 09:08 |只看该作者
LZ该翻翻C程序设计语言(K&R C).
这个实在是算不上坑.

论坛徽章:
2
2015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:56:11
15 [报告]
发表于 2013-05-02 10:11 |只看该作者
本帖最后由 cobras 于 2013-05-02 10:13 编辑

随手写了一个,没有文件测试。不适用于压缩的文件。
  1. #include <stdlib.h>
  2. #include <stdio.h>

  3. 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
  4.                                                           , unsigned long *o_value)
  5. {
  6.         int bit_index, bit_remain;
  7.         int offset;
  8.         int value;

  9.         offset = *io_offset;
  10.         bit_index = *io_bit_index;
  11.         bit_remain = *io_bit_remain;
  12.         value = 0;
  13.         while (bits_len > 0) {
  14.                 if (offset >= buff_len) {
  15.                         return -1;
  16.                 }
  17.                 if (bits_len >= bit_remain) {
  18.                         value <<= bit_remain;
  19.                         value |= buff[offset] & (1 << bit_remain);
  20.                         bit_remain = 8;
  21.                         bit_index = 7;
  22.                         ++offset;
  23.                         bits_len -= bit_remain;
  24.                 }else {
  25.                         value <<= bits_len;
  26.                         value |= (buff[offset] >> (bit_remain - bits_len)) & (1 << bits_len);
  27.                         bit_remain -= bits_len;
  28.                         bit_index -= bits_len;
  29.                         bits_len = 0;
  30.                 }
  31.         }
  32.         *io_offset = offset;
  33.         *io_bit_index = bit_index;
  34.         *io_bit_remain = bit_remain;
  35.         if (o_value != NULL) {
  36.                 *o_value = value;
  37.         }
  38.         return 0;
  39. }

  40. int flash_file_get_size(unsigned char *buff, int len, unsigned long *o_left, unsigned long *o_right
  41.                                                 , unsigned long *o_top, unsigned long *o_botton)
  42. {
  43.         int bits;
  44.         int bits_index;
  45.         int bits_remain;
  46.         int byte_index;

  47.         if (len >= 9) {
  48.                 bits = buff[8] >> 3;
  49.                 byte_index = 8;
  50.                 bits_index = 7 - 5;
  51.                 bits_remain = 8 - 5;
  52.                 if (flash_file_get_bits_value(buff, len, &byte_index, &bits_index, &bits_remain, bits, o_left) == 0) {
  53.                         if (flash_file_get_bits_value(buff, len, &byte_index, &bits_index, &bits_remain, bits, o_right) == 0) {
  54.                                 if (flash_file_get_bits_value(buff, len, &byte_index, &bits_index, &bits_remain, bits, o_top) == 0) {
  55.                                         if (flash_file_get_bits_value(buff, len, &byte_index, &bits_index, &bits_remain, bits, o_botton) == 0) {
  56.                                                 return 0;
  57.                                         }
  58.                                 }
  59.                         }
  60.                 }
  61.         }
  62.         return -1;
  63. }

  64. int flash_file_load(unsigned char **o_buff, int *o_buff_len, const char *file)
  65. {
  66.         FILE *fp;
  67.         long file_len;
  68.         unsigned char *buf;

  69.         fp = fopen(file, "rb");
  70.         if (fp != NULL) {
  71.                 fseek(fp, 0, SEEK_END);
  72.                 file_len = ftell(fp);
  73.                 fseek(fp, 0, SEEK_SET);
  74.                 buf = (unsigned char *)malloc(file_len);
  75.                 if (buf != NULL) {
  76.                         if (fread(buf, file_len, 1, fp) == 1) {
  77.                                 fclose(fp);
  78.                                 *o_buff = buf;
  79.                                 *o_buff_len = (int)file_len;
  80.                                 return 0;
  81.                         }
  82.                         free(buf);
  83.                 }
  84.                 fclose(fp);
  85.         }
  86.         return -1;
  87. }

  88. int main(void)
  89. {
  90.         unsigned char *buf;
  91.         int buf_len;
  92.         unsigned long left, right, top, botton;

  93.         if (flash_file_load(&buf, &buf_len, "test.swf") == 0) {
  94.                 if (flash_file_get_size(buf, buf_len, &left, &right, &top, &botton) == 0) {
  95.                         printf("left: %lu\n", left);
  96.                         printf("right: %lu\n", right);
  97.                         printf("top: %lu\n", top);
  98.                         printf("botton: %lu\n", botton);
  99.                         free(buf);
  100.                         return 0;
  101.                 }
  102.                 free(buf);
  103.         }
  104.         return -1;
  105. }
复制代码

论坛徽章:
0
16 [报告]
发表于 2013-05-03 14:52 |只看该作者
楼主你读2进制文件,肯定也是一个一个字节读的吧。楼主的问题应该是要跨字节拼接数据对吧?每个字节都是8位2进制数(0-255)你把它想想成字符串,按照逻辑截取,拼接就可以了,实在不明白,网上搜搜一些压缩算法的源代码。

论坛徽章:
0
17 [报告]
发表于 2013-05-04 14:09 |只看该作者
本帖最后由 Frahm 于 2013-05-04 14:09 编辑

没太懂问题所在,如果要读位的话,不用那么麻烦,我写了下。


  1. int getbit(size_t num, int i) {
  2.   return (num & (0x1 << i)) >> i;  
  3. }


  4. int main() {
  5.   size_t num = 0x8fffffff;
  6.   for(int i = sizeof(size_t) * 8 - 1; i >=0 ; --i) {
  7.    std::cout << getbit(num, i);
  8.   }
  9.   std::cout << '\n';
  10. }
复制代码

论坛徽章:
0
18 [报告]
发表于 2013-05-04 15:10 |只看该作者
本帖最后由 Frahm 于 2013-05-05 02:00 编辑

又看了下,感觉你要的是这个吧.
  1. unsigned getBitValue(char num, int i) {
  2.   return (num & (0x1 <<i));
  3. }

  4. unsigned readBits(char* buf, int index, int count) {
  5.   unsigned val = 0;
  6.   int i = index; //bits index of buf
  7.   int j = index - (index & ~7); //bits index within current byte
  8.   int bi = 0; //byte index of val
  9.   for(; i < index + count; ++i) {
  10.     val |= getBitValue(buf[i >> 3], j) << bi;
  11.     if(++j == 8) { //next byte
  12.       bi += 8;
  13.       j = 0;
  14.     }
  15.   }
  16.   return val;
  17. }

  18. int main() {
  19.   char buf[2] = {0xc0, 0x05};
  20.   unsigned a = readBits(buf, 6, 5);
  21.   for(int i = 31; i >=0; --i) {
  22.     std::cout << getbit(a,i); //这个是上一楼我发的那个函数,用来打印结果的
  23.     if((i&~7) == i) {
  24.       std::cout << ' ';
  25.     }
  26.   }
  27.   std::cout << '\n';
  28. }
复制代码
输出:
00000000 00000000 00000101 11000000

论坛徽章:
1
2015年迎新春徽章
日期:2015-03-04 09:50:28
19 [报告]
发表于 2013-05-06 10:17 |只看该作者

论坛徽章:
1
2015年迎新春徽章
日期:2015-03-04 09:50:28
20 [报告]
发表于 2013-05-06 10:18 |只看该作者
flash的乌龟速度,与这种奇葩的数据结构有着直接的关系。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP