免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 6925 | 回复: 15
打印 上一主题 下一主题

[C] 请教疑问!读取png图片内容到字符串,类似java的byte数组 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2018-02-23 11:26 |只看该作者 |倒序浏览
代码如下,请问为何图片内容打印出来是空的,txt文本却可以打印出来?

#include <stdio.h>  
#include <stdlib.h>                                                                                                                 

char* readFileBytes(const char *name)                                                                                               
{  
        FILE *fl = fopen(name, "r");                                                                                                
        fseek(fl, 0, SEEK_END);                                                                                                     
        long len = ftell(fl);                                                                                                      
        char *ret = malloc(len);  
        fseek(fl, 0, SEEK_SET);                                                                                                     
        fread(ret, 1, len, fl);                                                                                                     
        printf("%s\n", ret);         //打印为空????                                                                                               
        fclose(fl);  
        return ret;                                                                                                                 
}                                                                                                                                   
                                                                                                                                    
int main()                                                                                                                        
{
        readFileBytes("/home/ap/test/download2.png");
}   

论坛徽章:
6
数据库技术版块每日发帖之星
日期:2015-11-27 06:20:00程序设计版块每日发帖之星
日期:2015-12-01 06:20:00每日论坛发贴之星
日期:2015-12-01 06:20:0015-16赛季CBA联赛之佛山
日期:2017-03-26 23:38:0315-16赛季CBA联赛之江苏
日期:2017-07-17 10:08:4415-16赛季CBA联赛之北京
日期:2018-03-04 17:01:50
2 [报告]
发表于 2018-02-23 19:46 |只看该作者
ret[0 ~ 8]
[137][80][78][71][13][10][26][10][0][0]

80 P
78 N
71 G
ret[8] = 0 又称结束符
不可见 13,10,26,10

论坛徽章:
0
3 [报告]
发表于 2018-02-28 11:47 |只看该作者
回复 2# dorodaloo

多谢! 那如果想获得文件所有内容byte数组进行后续签名和验签处理有什么办法?我现在文本文件没有问题,图片还是无法进行后续操作。

论坛徽章:
6
数据库技术版块每日发帖之星
日期:2015-11-27 06:20:00程序设计版块每日发帖之星
日期:2015-12-01 06:20:00每日论坛发贴之星
日期:2015-12-01 06:20:0015-16赛季CBA联赛之佛山
日期:2017-03-26 23:38:0315-16赛季CBA联赛之江苏
日期:2017-07-17 10:08:4415-16赛季CBA联赛之北京
日期:2018-03-04 17:01:50
4 [报告]
发表于 2018-02-28 15:25 |只看该作者
回复 3# ryr1990

ret[0 ~ 7] 8 bytes == 签名
[137][80][78][71][13][10][26][10]

验签只要读取 8 bytes就可以了, <不需要获得文件所有内容byte数组>

简单的验签

  1. #include <stdbool.h>

  2. bool isPng(char *pngByteArray){
  3.     #define ISPNG 727905341920923785LL
  4.     long long check = *(long long *)pngByteArray;
  5.     return check == ISPNG;
  6. }
复制代码



...
/* 验签 */
  1. bool what = isPng(ret);
复制代码

论坛徽章:
0
5 [报告]
发表于 2018-03-01 14:02 |只看该作者
回复 4# dorodaloo

谢谢您,你指的是签名、验签都取文件前8个byte进行操作吧。  我现在用的是RSA算法验签,服务端用java是对整个文件内容进行签名的,然后返回signature和图片文件,公钥已经有了,这样也能取8个byte进行verify吗? 好像不行吧。

论坛徽章:
6
数据库技术版块每日发帖之星
日期:2015-11-27 06:20:00程序设计版块每日发帖之星
日期:2015-12-01 06:20:00每日论坛发贴之星
日期:2015-12-01 06:20:0015-16赛季CBA联赛之佛山
日期:2017-03-26 23:38:0315-16赛季CBA联赛之江苏
日期:2017-07-17 10:08:4415-16赛季CBA联赛之北京
日期:2018-03-04 17:01:50
6 [报告]
发表于 2018-03-01 19:11 |只看该作者
回复 5# ryr1990

是不行


我指的签名是

维基百科:
PNG文件包括8字节文件署名(signature)(89 50 4E 47 0D 0A 1A 0A,十六进制),用来识别PNG格式。

论坛徽章:
6
数据库技术版块每日发帖之星
日期:2015-11-27 06:20:00程序设计版块每日发帖之星
日期:2015-12-01 06:20:00每日论坛发贴之星
日期:2015-12-01 06:20:0015-16赛季CBA联赛之佛山
日期:2017-03-26 23:38:0315-16赛季CBA联赛之江苏
日期:2017-07-17 10:08:4415-16赛季CBA联赛之北京
日期:2018-03-04 17:01:50
7 [报告]
发表于 2018-03-01 19:17 |只看该作者
验签(byte数组);

论坛徽章:
0
8 [报告]
发表于 2018-03-02 10:33 |只看该作者
回复 7# dorodaloo

我现在的问题就是取不出来完整的byte数组,按正常步骤read到unsigned char数组后直接拿去验签通不过  。 是要从第八个字节读吗?我用十六进制编辑器打开图片,前八个字节不是89 50 4E 47 0D 0A 1A 0A呀,这个何解?

论坛徽章:
6
数据库技术版块每日发帖之星
日期:2015-11-27 06:20:00程序设计版块每日发帖之星
日期:2015-12-01 06:20:00每日论坛发贴之星
日期:2015-12-01 06:20:0015-16赛季CBA联赛之佛山
日期:2017-03-26 23:38:0315-16赛季CBA联赛之江苏
日期:2017-07-17 10:08:4415-16赛季CBA联赛之北京
日期:2018-03-04 17:01:50
9 [报告]
发表于 2018-03-02 19:16 |只看该作者
回复 8# ryr1990

ret 已经是完整的byte数组!!!

  1. for (int i = 0; i < 8; i++)
  2.     printf ("%02X ", (unsigned char)ret[i]);
复制代码



输出:
89 50 4E 47 0D 0A 1A 0A




其他我不懂.
等待路过大牛的回答

论坛徽章:
6
数据库技术版块每日发帖之星
日期:2015-11-27 06:20:00程序设计版块每日发帖之星
日期:2015-12-01 06:20:00每日论坛发贴之星
日期:2015-12-01 06:20:0015-16赛季CBA联赛之佛山
日期:2017-03-26 23:38:0315-16赛季CBA联赛之江苏
日期:2017-07-17 10:08:4415-16赛季CBA联赛之北京
日期:2018-03-04 17:01:50
10 [报告]
发表于 2018-03-02 19:38 |只看该作者
本帖最后由 dorodaloo 于 2018-03-03 09:03 编辑

你的验签函数如何写的?
具体看代码才能知道
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP