游戏开发论坛

 找回密码
 立即注册
搜索
查看: 2159|回复: 2

求教二进制!!!

[复制链接]

3

主题

12

帖子

154

积分

注册会员

Rank: 2

积分
154
发表于 2008-7-1 20:37:00 | 显示全部楼层 |阅读模式
向大虾们请教个问题:用MFC做个对话框编辑器,要求可以把任意文件保存成二进制文件,阅读时显示格式是0101……的二进制格式。。。
请问如何才能阅读时显示成0101……呢?
诚心求教,感激不尽!!!

3

主题

12

帖子

154

积分

注册会员

Rank: 2

积分
154
 楼主| 发表于 2008-7-1 20:47:00 | 显示全部楼层

Re:求教二进制!!!

//PS:这是已实现部分
// filewDlg.cpp : 实现文件
//

#include "stdafx.h"
#include "filew.h"
#include "filewDlg.h"
#include ".\filewdlg.h"
#include <fstream.h>


#ifdef _DEBUG
#define new DEBUG_NEW
#endif

// 用于应用程序“关于”菜单项的 CAboutDlg 对话框

class CAboutDlg : public CDialog
{
public:
        CAboutDlg();

// 对话框数据
        enum { IDD = IDD_ABOUTBOX };

        protected:
        virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV 支持

// 实现
protected:
        DECLARE_MESSAGE_MAP()
};

CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)
{
}

void CAboutDlg:oDataExchange(CDataExchange* pDX)
{
        CDialog::DoDataExchange(pDX);
}

BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)
END_MESSAGE_MAP()


// CfilewDlg 对话框



CfilewDlg::CfilewDlg(CWnd* pParent /*=NULL*/)
        : CDialog(CfilewDlg::IDD, pParent)
{
        m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}

void CfilewDlg::DoDataExchange(CDataExchange* pDX)
{
        CDialog::DoDataExchange(pDX);
}

BEGIN_MESSAGE_MAP(CfilewDlg, CDialog)
        ON_WM_SYSCOMMAND()
        ON_WM_PAINT()
        ON_WM_QUERYDRAGICON()
        //}}AFX_MSG_MAP
        ON_BN_CLICKED(ID_FILE_OPEN, OnBnClickedFileOpen)
        ON_BN_CLICKED(ID_FILE_SAVE, OnBnClickedFileSave)
        //ON_EN_CHANGE(IDC_EDIT2, OnEnChangeEdit2)
        ON_BN_CLICKED(IDC_BUTTON1, OnBnClickedButton1)
END_MESSAGE_MAP()


// CfilewDlg 消息处理程序

BOOL CfilewDlg::OnInitDialog()
{
        CDialog::OnInitDialog();

        // 将\“关于...\”菜单项添加到系统菜单中。

        // IDM_ABOUTBOX 必须在系统命令范围内。
        ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
        ASSERT(IDM_ABOUTBOX < 0xF000);

        CMenu* pSysMenu = GetSystemMenu(FALSE);
        if (pSysMenu != NULL)
        {
                CString strAboutMenu;
                strAboutMenu.LoadString(IDS_ABOUTBOX);
                if (!strAboutMenu.IsEmpty())
                {
                        pSysMenu->AppendMenu(MF_SEPARATOR);
                        pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
                }
        }

        // 设置此对话框的图标。当应用程序主窗口不是对话框时,框架将自动
        //  执行此操作
        SetIcon(m_hIcon, TRUE);                        // 设置大图标
        SetIcon(m_hIcon, FALSE);                // 设置小图标

        // TODO: 在此添加额外的初始化代码
       
        return TRUE;  // 除非设置了控件的焦点,否则返回 TRUE
}

void CfilewDlg::OnSysCommand(UINT nID, LPARAM lParam)
{
        if ((nID & 0xFFF0) == IDM_ABOUTBOX)
        {
                CAboutDlg dlgAbout;
                dlgAbout.DoModal();
        }
        else
        {
                CDialog::OnSysCommand(nID, lParam);
        }
}

// 如果向对话框添加最小化按钮,则需要下面的代码
//  来绘制该图标。对于使用文档/视图模型的 MFC 应用程序,
//  这将由框架自动完成。

void CfilewDlg::OnPaint()
{
        if (IsIconic())
        {
                CPaintDC dc(this); // 用于绘制的设备上下文

                SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);

                // 使图标在工作矩形中居中
                int cxIcon = GetSystemMetrics(SM_CXICON);
                int cyIcon = GetSystemMetrics(SM_CYICON);
                CRect rect;
                GetClientRect(&rect);
                int x = (rect.Width() - cxIcon + 1) / 2;
                int y = (rect.Height() - cyIcon + 1) / 2;

                // 绘制图标
                dc.DrawIcon(x, y, m_hIcon);
        }
        else
        {
                CDialog::OnPaint();
        }
}

//当用户拖动最小化窗口时系统调用此函数取得光标显示。
HCURSOR CfilewDlg::OnQueryDragIcon()
{
        return static_cast<HCURSOR>(m_hIcon);
}

void CfilewDlg::OnBnClickedFileOpen()
{
        // TODO: 在此添加控件通知处理程序代码
       
        CFileDialog dlg(TRUE,    "*",   NULL, OFN_HIDEREADONLY|OFN_ALLOWMULTISELECT,"Excel file(*.*)|*.*");   
        //memset(FileName,0,sizeof(FileName) );
        int   FileIndex = 0;
        int   FindName  = 0;
        CString    szPathName;
        dlg.DoModal();
       
                POSITION pos;   
                pos =    dlg.GetStartPosition();   
                while(pos)   
                {   
                        szPathName=dlg.GetNextPathName(pos);

                        vecStatck.push_back(szPathName);
                } //while(pos)   
       
                //int iSize;

                //iSize=vecStatck.size();
                //for (i=0;i<iSize;i++)
                //{
                //        szPathName=vecStatck;
                //}
  //
                //vecStatck.clear();


}

void CfilewDlg::OnBnClickedFileSave()
{
        // TODO: 在此添加控件通知处理程序代码
/*        CFileDialog dlg(FALSE,    "*",   NULL, OFN_HIDEREADONLY|OFN_ALLOWMULTISELECT,"Excel file(*.*)|*.*");   

        if(dlg.DoModal()==IDOK)
        {
                */


                TCHAR pszBuffer[_MAX_PATH];
                BROWSEINFO bi; LPITEMIDLIST pidl;
                bi.hwndOwner = NULL;
                bi.pidlRoot = NULL;
                bi.pszDisplayName = pszBuffer;
                bi.lpszTitle = _T("选择文件的路径");
                bi.ulFlags = BIF_RETURNFSANCESTORS | BIF_RETURNONLYFSDIRS;
                bi.lpfn = NULL;
                bi.lParam = 0;
                if((pidl = SHBrowseForFolder(&bi)) != NULL)
                {
                if(SHGetPathFromIDList(pidl, pszBuffer))
                {
                CString strTemp(pszBuffer);
                 Stopath = strTemp;
               
                if (Stopath.GetLength() <= 1)
                {
                        int dde = 10;
                }
                else if (Stopath.Right(1) != _T("\\"))
                Stopath += _T("\\");
                 
                }

                }
       
                GetDlgItem(IDC_EDIT1)->SetWindowText(Stopath);

       
               
                //CString  Spath = Stopath;
                //int Where;   
                //Where = Spath.ReverseFind('\\');



                //vecStatck.clear();
        //POSITION pos;   
        //pos =    dlg.GetStartPosition();   
        //while(pos)   
        //{   
        //        CString    szPathName=dlg.GetNextPathName(pos);

        //        CFile   file( szPathName,CFile::modeRead);//只读方式打开


        //}  
       
}

void CfilewDlg::OnEnChangeEdit2()
{
        // TODO:  如果该控件是 RICHEDIT 控件,则它将不会
        // 发送该通知,除非重写 CDialog::OnInitDialog()
        // 函数并调用 CRichEditCtrl().SetEventMask(),
        // 同时将 ENM_CHANGE 标志“或”运算到掩码中。

        // TODO:  在此添加控件通知处理程序代码
         
}
CString CfilewDlg::GetFileTitleFromFileName(CString FileName, BOOL Ext)   
{   
        int Where;   
        Where = FileName.ReverseFind('\\');
        if (Where == -1)
                Where = FileName.ReverseFind('/');
        CString FileTitle = FileName.Right(FileName.GetLength() - 1 - Where);
        if (!Ext)
        {
                int Which = FileTitle.ReverseFind('.');   
                if (Which != -1)   
                        FileTitle = FileTitle.Left(Which);   
        }   
        return FileTitle;   
}   

void CfilewDlg::OnBnClickedButton1()
{
        // TODO: 在此添加控件通知处理程序代码

       
        CString  WriteFileName;
        CString  Bufpath;
       
        int iSize = 0;
        iSize = vecStatck.size();


        for (int i=0;i<iSize;i++)
        {
                CString  ResultPath;
                CString  BStopath = Stopath;

                Bufpath = vecStatck;
                ResultPath = GetFileTitleFromFileName( Bufpath,TRUE);
       

                BStopath +="Copy";
                BStopath        += ResultPath;
                //vecSaveName.push_back(Stopath);
                CFile   file( Bufpath,CFile::modeRead);//只读方式打开
                int     size   =  file.GetLength();      
                char    *buf    =  new  char[size + 1];   
                file.Read(buf,size);      
                buf[size] =  0;  
                file.Close();

                CFile createTxtFile( BStopath, CFile::modeCreate | CFile::typeBinary );
                createTxtFile.Close();


                //CFile readTxtFile( BStopath, CFile::modeRead | CFile::typeBinary );
                //int intValueOut = 0;
                //float fltValueOut = 0;
                //char strValueOut[20] = "\0";
                //readTxtFile.Read( &intValueOut, sizeof(int));
                //readTxtFile.Read( &fltValueOut, sizeof(float));
                //readTxtFile.Read( strValueOut, sizeof(strValueOut));
                //readTxtFile.Close();

                CFile writeTxtFile( BStopath, CFile::modeReadWrite | CFile::typeBinary );
                /*int intValueIn = 10000;
                float fltValueIn = 123.456f;
                char strValueIn[20] = "乱码luanma";*/
                float fltValueIn = 123.456f;
                //writeTxtFile.Write( buf, size);
                writeTxtFile.Write( &fltValueIn, sizeof(float));
                /*writeTxtFile.Write( &strValueIn, sizeof(strValueIn));*/
                writeTxtFile.Close();

                delete buf;
                buf = NULL;

               

                       
                ofstream fout("file.dat", ios::binary);
                int test = 1;
                fout.write((char *)(&test), sizeof(test));

               
                int test;
                ifstream fin("file.dat", ios::binary);
                fin.read((char *)(&test), sizeof(test));















        }
        //for (int i=0;i<iSize;i++)
        //{
        //        WriteFileName = vecStatck;
        //        CFile   file( WriteFileName,CFile::modeRead);//只读方式打开
        //}

}

6

主题

40

帖子

40

积分

注册会员

Rank: 2

积分
40
发表于 2008-7-9 11:06:00 | 显示全部楼层

Re: 求教二进制!!!


  1. char* char2bin(char* str)
  2. {
  3.         int l = strlen(str)*8+1;
  4.         char* ot = new char[l];
  5.         memset(ot, '0', l);
  6.         ot[l-1] = 0;
  7.         char buf[9];
  8.         int n = 0;
  9.         do
  10.         {
  11.                 itoa(*str, buf, 2);
  12.                 l = strlen(buf);
  13.                 memcpy(ot+n+(8-l), buf, l);
  14.                 n+=8;
  15.         }
  16.         while(*(++str));
  17.         return ot;
  18. }
复制代码
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2026-1-22 01:29

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表