免费注册 查看新帖 |

Chinaunix

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

[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");
}   

论坛徽章:
0
2 [报告]
发表于 2018-02-28 11:47 |显示全部楼层
回复 2# dorodaloo

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

论坛徽章:
0
3 [报告]
发表于 2018-03-01 14:02 |显示全部楼层
回复 4# dorodaloo

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

论坛徽章:
0
4 [报告]
发表于 2018-03-02 10:33 |显示全部楼层
回复 7# dorodaloo

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

论坛徽章:
0
5 [报告]
发表于 2018-03-05 10:26 |显示全部楼层
回复 10# dorodaloo

不好意思,回复晚了。下面是验签的代码
int verify(char *data, char *resp)
{
    char *signBuf= malloc(BUFFER_SIZE);
    char *timeBuf = malloc(BUFFER_SIZE);
    char *contentLenBuf = malloc(BUFFER_SIZE);
    memcpy(signBuf, data, strlen(data));
    memcpy(timeBuf, data, strlen(data));
    memcpy(contentLenBuf, data, strlen(data));
    int r,headnum,m, contentnum;
    char sign[500];
    char *timestamp = malloc(100);
    char contentLen[5];
    while (1)
    {
        r=sscanf(contentLenBuf, "Content-Length: %[^\n]%n", contentLen, &contentnum);
        if (1==r) {
            contentLenBuf+=contentnum;
        } else if (0==r) contentLenBuf++;
        else break;

        r=sscanf(signBuf,"Signature: %[^\n]%n",sign,&headnum);
        if (1==r) {
            signBuf+=headnum;
        } else if (0==r) signBuf++;
        else break;

        r=sscanf(timeBuf,"Timestamp: %[^\n]%n",timestamp,&m);
        if (1==r) {
            timeBuf+=m;
        } else if (0==r) timeBuf++;
        else break;
    }
    char *body = malloc(BUFFER_SIZE);
    memcpy(body, data+(strlen(data)-atoi(contentLen)), atoi(contentLen));

    // 在这一步之前body如果是图片内容,打印出来是空的,下一步验证就失败;如果body是文本内容验证成功
    verifyByRSA(pubKey, body, strlen(body), sign);
    strcpy(resp, body);
}


int verifyByRSA(char* publicKey, const unsigned char * pData, size_t dataLength, unsigned char * sign)
{
    RSA* rsa_pub_key = createPublicRSA(publicKey);
    if (rsa_pub_key == NULL)
    {
        printf("\n创建公钥内容失败\n");
        return false;
    }

    unsigned char szSha1Data[SHA_DIGEST_LENGTH+1] = { 0 };
    memset(szSha1Data, 0, sizeof(szSha1Data));
    SHA_CTX c;
    if (!SHA1_Init(&c))
    {
        printf("\n初始化sha1算法失败!\n");
        return false;
    }
    SHA1_Update(&c, pData, strlen((char*)pData));
    SHA1_Final(szSha1Data, &c);
    OPENSSL_cleanse(&c, sizeof(c));

    unsigned char *outstr = base64_decode(sign);
    int r = RSA_verify(NID_sha1, szSha1Data, SHA_DIGEST_LENGTH, outstr, 256, rsa_pub_key);
    RSA_free(rsa_pub_key);
    if (1 == r)
    {
        printf("验签成功\n");
        return 0;   
    }
    else
    {
        printf("验签失败\n");
        return 1;
    }
}



论坛徽章:
0
6 [报告]
发表于 2018-03-05 17:03 |显示全部楼层
回复 12# dorodaloo

OK,明天试下,现在不在电脑前,哈哈

论坛徽章:
0
7 [报告]
发表于 2018-03-06 10:47 |显示全部楼层
回复 12# dorodaloo

那个长度dataLength参数好像没用到,这就尴尬了,应该不是strlen导致的问题。

论坛徽章:
0
8 [报告]
发表于 2018-03-06 14:17 |显示全部楼层
回复 15# dorodaloo

是哦,已经修改好了,感谢感谢,给大佬递烟,哈哈。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP