c++ 如何将文件转成二进制流并存到数组中

YiRanMengJiangHu 2017-04-12 01:30:35
RT,在MFC中 ,将文件(文本、图片、word等)转换成二进制流存到数组中是怎么实现的,求大神说明最好附上代码
...全文
2321 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
xiaohuh421 2017-04-18
  • 打赏
  • 举报
回复
引用 18 楼 YiRanMengJiangHu 的回复:
@xiaohuh421 图片 word 等格式都可以用这个转成字节流的吗 我这试验没反应
这个不是转换, 它只是把二进制流打印输出(可能是控制台,或者debug窗口, 看你printLog函数的实现) char buf[0x400]={0}; FILE *pFile = fopen(filePath, "rb); // filePath可以是任意格式的文件的路径. if(pFlie) { int readLen = fread(buf,1,0x400,pFile); //读取文件到数据流缓冲区 printBuffHexString(buf,readLen); //打印数据流 fclose(pFile); }
赵4老师 2017-04-16
  • 打赏
  • 举报
回复
电脑内存或文件内容或传输内容只是一个一维二进制字节数组及其对应的二进制地址; 人脑才将电脑内存或文件内容或传输内容中的这个一维二进制字节数组及其对应的二进制地址的某些部分看成是整数、有符号数/无符号数、浮点数、复数、英文字母、阿拉伯数字、中文/韩文/法文……字符/字符串、汇编指令、函数、函数参数、堆、栈、数组、指针、数组指针、指针数组、数组的数组、指针的指针、二维数组、字符点阵、字符笔画的坐标、黑白二值图片、灰度图片、彩色图片、录音、视频、指纹信息、身份证信息…… 推荐使用WinHex软件查看硬盘或文件或内存中的原始字节内容。
xiaohuh421 2017-04-14
  • 打赏
  • 举报
回复
既然是字节流, 就不应该用字符串的方式打印出来. 这里给一个我写的函数, 用于打印字节流
void printBuffHexString(const void *pBuf, int len)
{
    len = min(64, len);
    const unsigned char *buf = (const unsigned char*)pBuf;
    //总字节数=行数x每行字节数  每行字节数=字节数*3字节+ 空格+回车+16个字符  每个节点用3个,是16进制占两位,加空格占1位
    int buffSize = (len + 15) / 16 * (16 * 3 + 5 + 16 + 1);
    buffSize += 4; //多几个字节,防止sprintf_s报缓冲区大小不足.
    char *str = (char*)_alloca(buffSize);
    memset(str, 0, buffSize);
    char *outBuf = str;
    char temp[0x20] = {0};
    int j = 0;
    for(int i = 0; i < len; ++i)
    {
        sprintf_s(outBuf, 4, "%02X ", buf[i]); //注意这里sprintf_s会在后面增加0xFEFEFEFE , 可能导致越界
        temp[j] = buf[i];
        outBuf += 3;
        ++j;
        if((i + 1) % 16 == 0)
        {
            temp[j] = 0;
            for(int k = 0; k < 16; ++k)
            {
                if(temp[k] < 0x20 || temp[k] == 0x7F)
                {
                    temp[k] = '.';
                }
            }
            j = sprintf_s(outBuf, 19, " %s\n", temp);
            outBuf += j;
            j = 0;
        }
    }
    if(j > 0)
    {
        memset(outBuf, 0x20, (16 - j) * 3); //不满16个, 以空格填充
        outBuf += (16 - j) * 3;
        temp[j] = 0;
        for(int k = 0; k < j; ++k)
        {
            if(temp[k] < 0x20 || temp[k] == 0x7F)
            {
                temp[k] = '.';
            }
        }
        j = sprintf_s(outBuf, 19, " %s\n", temp);
        outBuf += j;
    }
    outBuf[0] = '\n';
    outBuf[1] = 0;
    printLog("\nprint buffer len:%d\n%s", len, str);
}
YiRanMengJiangHu 2017-04-14
  • 打赏
  • 举报
回复
@ kakabulusi 怎么进行清空的?不懂
kakabulusi 2017-04-14
  • 打赏
  • 举报
回复
使用前先对buffer进行一下清空操作,防止出现温度过高【烫........烫】的情况。 流式传输都会存在一些问题。
叶恭介叶恭介 2017-04-14
  • 打赏
  • 举报
回复
引用 13 楼 YiRanMengJiangHu 的回复:
@叶恭介1989 我感觉不对吧 这是buffer 的值,照你的说法这是字节流?是这种格式的?
你应该用16进制或数字格式打印buffer,不是字符串形式
YiRanMengJiangHu 2017-04-14
  • 打赏
  • 举报
回复
@叶恭介1989 我感觉不对吧 这是buffer 的值,照你的说法这是字节流?是这种格式的?
叶恭介叶恭介 2017-04-14
  • 打赏
  • 举报
回复
引用 11 楼 YiRanMengJiangHu 的回复:
还有没有人回答下,咋转换成字节流
char buffer[1024]; 就是字节流
YiRanMengJiangHu 2017-04-14
  • 打赏
  • 举报
回复
还有没有人回答下,咋转换成字节流
YiRanMengJiangHu 2017-04-14
  • 打赏
  • 举报
回复
@xiaohuh421 图片 word 等格式都可以用这个转成字节流的吗 我这试验没反应
YiRanMengJiangHu 2017-04-12
  • 打赏
  • 举报
回复
引用 9 楼 oyljerry 的回复:
主要就是读取的时候用二进制方式,然后把数据保存到BYTE数组,而不是放到String等字符串
我用fstream 文件流 file.open(stre, ios::binary|ios::in); if ( !file.is_open() ) { return; } char buffer[1024]; //存储读取字符串 file.read(buffer, 1024); file.close(); 这样写有没有问题的
oyljerry 2017-04-12
  • 打赏
  • 举报
回复
主要就是读取的时候用二进制方式,然后把数据保存到BYTE数组,而不是放到String等字符串
YiRanMengJiangHu 2017-04-12
  • 打赏
  • 举报
回复
引用 4 楼 pcradio 的回复:
new一个缓冲,缓冲大小等于或大于文件大小,然后fread以二进制读进去就可以了,这个有什么难的?
不太懂呀,举个列子
YiRanMengJiangHu 2017-04-12
  • 打赏
  • 举报
回复
引用 6 楼 cvbtvbwu 的回复:
字节,二进制,给楼主搞浑了,文件读取不是一直是字节的吗?谁能告诉我
那就是字节流了 其实我不懂的,给个方法
叶恭介叶恭介 2017-04-12
  • 打赏
  • 举报
回复
字节,二进制,给楼主搞浑了,文件读取不是一直是字节的吗?谁能告诉我
赵4老师 2017-04-12
  • 打赏
  • 举报
回复
仅供参考:
//将c:\\tmp文件夹下的所有文件的内容全部放到用malloc分配的内存中
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <io.h>
struct FB {
    char fn[256];
    size_t fl;
    char *b;
    struct FB *next;
    struct FB *prev;
} *fh,*fb,*ft;
char ln[256];
char fpn[256];
FILE *af;
FILE *f;
int L,n;
int main() {
    system("dir /b /a-d c:\\tmp\\*.* >c:\\allfn.txt");
    af=fopen("c:\\allfn.txt","r");
    if (NULL==af) {
        printf("Can not open file c:\\allfn.txt!\n");
        return 1;
    }
    fh=NULL;
    fb=NULL;
    n=0;
    while (1) {
        if (NULL==fgets(ln,256,af)) break;
        L=strlen(ln);
        if ('\n'==ln[L-1]) ln[L-1]=0;
        printf("read %s\n",ln);
        strcpy(fpn,"c:\\tmp\\");
        strcat(fpn,ln);
        ft=(struct FB *)malloc(sizeof(struct FB));
        if (NULL==ft) {
            printf("Can not malloc ft!\n");
            fclose(af);
            return 2;//之前的malloc在main退出后由操作系统自动free
        }
        printf("ft[%d]==%p\n",n,ft);
        strcpy(ft->fn,fpn);
        f=fopen(fpn,"rb");
        if (NULL==f) {
            printf("Can not open file %s!\n",fpn);
            fclose(af);
            return 3;//之前的malloc在main退出后由操作系统自动free
        }
        ft->fl=_filelength(fileno(f));
        ft->b=malloc(ft->fl);
        if (NULL==ft->b) {
            printf("Can not malloc ft->b!\n");
            fclose(f);
            fclose(af);
            return 4;//之前的malloc在main退出后由操作系统自动free
        }
        printf("ft[%d]->b==%p\n",n,ft->b);
        if (ft->fl!=fread(ft->b,1,ft->fl,f)) {
            printf("fread error!\n");
            fclose(f);
            fclose(af);
            return 5;//之前的malloc在main退出后由操作系统自动free
        }
        fclose(f);
        ft->next=NULL;

        if (NULL==fh) {
            ft->prev=NULL;
            fh=ft;
        } else {
            fb->next=ft;
            ft->prev=fb;
        }
        fb=ft;
        n++;
    }
    fclose(af);
    printf("-----list-----\n");
    for (ft=fh;NULL!=ft;ft=ft->next) {
        printf("%8d %s\n",ft->fl,ft->fn);
        if (NULL!=ft) fb=ft;
    }
    printf("-----free-----\n");
    n--;
    if (NULL!=fh) {
        for (ft=fb->prev;NULL!=ft;ft=ft->prev) {
            if (NULL!=ft->next->b) {
                printf("ft[%d]->b==%p\n",n,ft->next->b);
                free(ft->next->b);
            }
            if (NULL!=ft->next) {
                printf("ft[%d]==%p\n",n,ft->next);
                free(ft->next);
            }
            n--;
        }
        if (NULL!=fh->b) {
            printf("ft[0]->b==%p\n",fh->b);
            free(fh->b);
        }
        printf("ft[0]==%p\n",fh);
        free(fh);
    }
    return 0;
}
//C:\tmp\tmp\Debug>dir /a-d c:\tmp
// 驱动器 C 中的卷是 C_HD5_1
// 卷的序列号是 1817-D526
//
// c:\tmp 的目录
//
//找不到文件
//
//C:\tmp\tmp\Debug>tmp
//找不到文件
//-----list-----
//-----free-----
//
//C:\tmp\tmp\Debug>dir /a-d c:\tmp
// 驱动器 C 中的卷是 C_HD5_1
// 卷的序列号是 1817-D526
//
// c:\tmp 的目录
//
//2011-06-30  18:04            44,840 my_c.rar
//2011-06-30  17:18             1,036 err.frm
//2011-06-30  14:32            14,243 出租.txt
//2011-06-28  12:08            23,681 MSDN98书签.txt
//             4 个文件         83,800 字节
//             0 个目录 17,041,870,848 可用字节
//
//C:\tmp\tmp\Debug>tmp
//read my_c.rar
//ft[0]==00421800
//ft[0]->b==00520068
//read err.frm
//ft[1]==00421670
//ft[1]->b==0052AFC0
//read 出租.txt
//ft[2]==00421530
//ft[2]->b==00378F28
//read MSDN98书签.txt
//ft[3]==004213F0
//ft[3]->b==0052B3F8
//-----list-----
// 44840 c:\tmp\my_c.rar
//  1036 c:\tmp\err.frm
// 14243 c:\tmp\出租.txt
// 23681 c:\tmp\MSDN98书签.txt
//-----free-----
//ft[3]->b==0052B3F8
//ft[3]==004213F0
//ft[2]->b==00378F28
//ft[2]==00421530
//ft[1]->b==0052AFC0
//ft[1]==00421670
//ft[0]->b==00520068
//ft[0]==00421800
//
//C:\tmp\tmp\Debug>
阿源是少年 2017-04-12
  • 打赏
  • 举报
回复
new一个缓冲,缓冲大小等于或大于文件大小,然后fread以二进制读进去就可以了,这个有什么难的?
YiRanMengJiangHu 2017-04-12
  • 打赏
  • 举报
回复
引用 2 楼 cvbtvbwu 的回复:
”二进制流存到数组中“,我比较想知道,你这个数组是用做什么的?
一个接口,需要将文件传进去
叶恭介叶恭介 2017-04-12
  • 打赏
  • 举报
回复
”二进制流存到数组中“,我比较想知道,你这个数组是用做什么的?
YiRanMengJiangHu 2017-04-12
  • 打赏
  • 举报
回复
顶一个!

18,356

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 网络编程
c++c语言开发语言 技术论坛(原bbs)
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧