RT,
程序以简单为美,分数全给写的最简单的那个人

解决方案 »

  1.   


    FILE* fpFile = fopen(dlg.GetPathName(), "rb");
    if (!fpFile)
    return ; unsigned char* bytebuff = 0;
    fseek(fpFile, 0, SEEK_END);
    int file_len = ftell(fpFile);
    fseek(fpFile, 0, SEEK_SET); bytebuff = new unsigned char[file_len];
    fread(bytebuff, file_len, 1, fpFile); m_sDisplayFile = "";
    for (int i = 0; i < file_len; ++i)
    {
    unsigned long dw = (unsigned long)bytebuff[i];
    CString str;
    str.Format("%02x", dw);
                    m_sDisplayFile += str; }
    delete bytebuff;
    fclose(fpFile);
            String2Hex(m_sDisplayFile);
    }//将字符串转为十六进制字符串
    int CKeyReaderDlg::String2Hex(CString &str)
    {
    int hexdata,lowhexdata;
    int hexdatalen = 0;
    int len=str.GetLength(); 
    m_sendData.SetSize(len);
    for(int i=0; i < len;)  
    {
    char lstr, hstr = str[i]; 
    i++;
    if(i >= len)
    break;
    lstr = str[i];
            hexdata = ConvertHexChar(hstr);
    lowhexdata = ConvertHexChar(lstr);
    if ((hexdata == 16) || (lowhexdata == 16))
    break;
    else
    hexdata = hexdata * 16 + lowhexdata; 
    i++;
    m_sendData[hexdatalen] = (char)hexdata; 
    hexdatalen++;
    }
    m_sendData.SetSize(hexdatalen);
    return   hexdatalen;
    }//功能:若是在0-F之间的字符,则转换为相应的十六进制字符,否则返回-1
    char CKeyReaderDlg::ConvertHexChar(char ch) 
    {
    if ((ch >= '0 ') && (ch <= '9')) 
    return ch - 0x30;
    else if ((ch >= 'A') && (ch <= 'F')) 
    return ch - 'A' + 10;
    else if ((ch >= 'a') && (ch <= 'f'))   
    return ch - 'a' + 10;  
    else return (-1);   
    }这是我的实现方法,显然太麻烦了。。
      

  2.   

    纵观你的代码 可以简写成几行CStdioFile file;
    file.Open(dlg.GetPathName(), CFile::modeRead);
    file.ReadString(m_sendData);
      

  3.   

    char strHex[1000];
    unsigned char byTemp;
    for(int i=0;i<1000;i+=2)
       sscanf(strHex+i,"%x",&byTemp)类似这样
      

  4.   

    好吧 我又回来了 按我的理解给你写了段代码 CFile file;
    file.Open(path, CFile::modeRead); int fileSize = file.GetLength(); CString txtResult;
    file.Read(txtResult.GetBuffer(fileSize+1), fileSize);
    txtResult.ReleaseBuffer(fileSize); CString hexResult;
    char *pBuf = hexResult.GetBuffer(fileSize*2 + 1); const char* pStr = txtResult;
    while (*pStr)
    {
    sprintf(pBuf, "%0.2X", *pStr++);
    pBuf += 2;
    }
    hexResult.ReleaseBuffer(fileSize<<1); file.Close();
      

  5.   

    就是HEX文件,里面的数据都是十六进制数
      

  6.   

    形如 0102030405060708090A0B0C0D0E0F1112131415161718191A1B1C1D1E1F 这样以ASC码形式体现数据的?
      

  7.   

    能有啥好方法哦?不就是一个字符一个字符的处理么?每次处理,要么直接用if..else..,要么麻烦点用switch,估计用switch速度更快一点点。然后每处理两个字符,保存一个字节。
      

  8.   

    假设保存的十六进制文件是每个字节都保存为十六进制,这里的代码也可以简写为 FILE* fpFile = fopen(dlg.GetPathName(), "rb");
        if (!fpFile)
            return ;    unsigned char* bytebuff = 0;
        fseek(fpFile, 0, SEEK_END);
        int file_len = ftell(fpFile);
        fseek(fpFile, 0, SEEK_SET);    bytebuff = new unsigned char[file_len];
        fread(bytebuff, file_len, 1, fpFile);    m_sDisplayFile = "";
        for (int i = 0; i < file_len; ++i)
        {
            unsigned long dw = (unsigned long)bytebuff[i];
            CString str;
            str.Format("%02x", dw);
                    m_sDisplayFile += str;    }
        delete bytebuff;
        fclose(fpFile);
      

  9.   

    前段时间我要做一个同样的问题,结果没有人理我,自己却弄出来了,楼主,你分子给的高,来的人多
    楼主,其实十六进制的文件,只是表示形式上的不同,内容一样。
    1.用二进制读取。
    2.每读两位存入一个BYTE。
    3.把两位十六进制数转换成十进制数,即字符编码。(十六进制转十进制,需要自己写)
    4.循环直至结束。
      

  10.   


    应该称为对一段字符进行编码比较合适,和Base64等差不多,只是你的要求更简单些
      

  11.   

       CFile m_file;
       BYTE  *pBt;
      
       m_file.Open()
       pBt = new BYTE(m_file.getLegth());
       pBt = m_file.Read(m_file.getLegth());
       ... ...   delete pBt; 
      

  12.   

    可以先读出来
    然后再字符串转为十六进制数啊 如int32.parse();
    十六进制再转为字节就行 Convert.ToByte();
      

  13.   

    #include <stdio.h>int main( int argc, char *argv[] )
    {
    char buf[1024 + 1];
    char ch;
    int index = 0;
    FILE *fp;
    memset( buf, 0x00, sizeof(buf) ); 

    if ( ( fp = fopen( argv[1], "rb" ) ) == NULL )
    {
    printf( " Error\n");
    return 1;
    }
    while ( ( ch = fgetc( fp ) ) != EOF && !feof( fp ) && index < 1024 )
    {
    sprintf( buf + index,"%02x\n", ch );
    index += 2;
    }
    printf( "RE:\n%s\n", buf );
    return 0;
    }
    试试这个可以么?关于十六进制中如何判断文件结束还是有疑问
      

  14.   

    工具有,winhex.我经常把一个文件做buffer.
    winhex那个功能读出来就已经是
    unsigned char data[xx]={0x11,0x22...};
    这样了,使用相当方便
      

  15.   


    所有的计算机里的文件都是二进制的。没有什么文件是以16进制保存的。16进制显示是为了人读取方便。
    字节数组?我以前没听过,以后也许会学到。我只听过字符数组比较类似。再有你在13楼问“只实现了一半,还有保存为字节数组呢”
    CString m_sendData;本身就是一个无定长度的字符串数组。
    m_sendData.GetAt(0)就是第1个元素。
    m_sendData.GetAt(1)就是第2个元素。
    ……
      

  16.   

    To 45 楼 baoyz 的回复:]
    你好,感谢回复。
    计算机中的文件最终都是用0和1表示,即二进制。但是文件的编码和保存则有多种格式,ASCII,二进制(BIN),十六进制(HEX)。
    字节数组,这里说的是BYTE为类型保存的数组,既然能用INT,CHAR,为什么不能用BYTE呢。
    它这里只是存为字符而已,并未转存为字节(BYTE)格式。
      

  17.   

    难道我的不行么?貌似少了个string.h,在命令行下可以运行呀,不过要输入你要测试的文件名字 否则报错。