例如有一个二进制文件,前面几个字节是:
AC 52 1D 67 9B CE BF 11 38 D1 C2 B5
我现在想在每一次循环中依次取4字节,做为一个十六进制值。
例如:第一次取值是0xAC521D67 而不是"AC521D67"
      第二次取值是0x9BCEBF11
      第三次取值是0x38D1C2B5这样的程序应该怎么做呀?

解决方案 »

  1.   

    按一个DWORD类型读出来
    然后通过
    %08x来格式化
      

  2.   


    DWORD dwWord;
    ................
    m_File.Read(dwWord,4);这样从文件里读出4字节大小放到dwWord吗??
    程序执行到这里的时候就出错了。  
      

  3.   

    ifstream inBin(_T("xxx.bin"),ios::in|ios::binary);
    ASSERT(inBin); int length;
    char * buffer;
    // get length of file:
    inBin.seekg (0, ios::end);
    length = inBin.tellg();
    inBin.seekg (0, ios::beg);

    // allocate memory:
    buffer = new char [length];

    // read data as a block:
    inBin.read (buffer,length);
    DWORD *dwData = (DWORD *)buffer;
    int nWorkingLength;
    nWorkingLength = length/4; DWORD dwResult;
    TCHAR szResult[1024];
    for (int i = 0; i < nWorkingLength; i++)
    {
    dwResult = * (dwData+i);
    sprintf(szResult,_T("%d:0x%x"),i, dwResult);
    }
      

  4.   

    读进来,然后htonl搞定。
      

  5.   


    Debug Assertion Failed!
    For information on how your program can cause an assertion failure,
    see the Visual C++ documentation on asserts;
      

  6.   

    unsigned char buf[4];
    m_File.Read((char *)buf,4);DWORD dwWord;dwWord=buf[0];
    dwWork<<=4;
    dwWord+=buf[1];
    dwWork<<=4;
    dwWord+=buf[2];
    dwWork<<=4;
    dwWord+=buf[3];
      

  7.   

    m_File.Read(dwWord,4);肯定是错的,至少也要写成:m_File.Read(&dwWord,4);不过这样的话,dwWord=0x671D52AC, 而不是:0xAC521D67
      

  8.   

    更正:应该是左移8位:unsigned char buf[4];
    m_File.Read((char *)buf,4);DWORD dwWord;dwWord=buf[0];
    dwWork<<=8;
    dwWord+=buf[1];
    dwWork<<=8;
    dwWord+=buf[2];
    dwWork<<=8;
    dwWord+=buf[3];
      

  9.   


    恩,我在定义DWORD的时候是定义指针类型的,写上来写错了。呵呵。。还有,你那种位移的方法很好。但因为是单个字节处理的,所以在速度上可能有些慢。谢谢你。朋友。
      

  10.   


    [code]
        ifstream inBin(_T("xxx.bin"),ios::in|ios::binary);  //二进制打开文件
        ASSERT(inBin);  //是否正常打开    int length;
        char * buffer;    
        // get length of file:
        inBin.seekg (0, ios::end); // 这里设置文件指针要怎么理解呀?从0开始,偏移到文件尾吗?
        length = inBin.tellg();  //这!!
        inBin.seekg (0, ios::beg); //文件指针又到开始位置?
        
        // allocate memory:
        buffer = new char [length];
        
        // read data as a block:
        inBin.read (buffer,length);
        DWORD *dwData = (DWORD *)buffer; //这里转换后dwData是个十进制值,不清楚是如何得来的
        int nWorkingLength;
        nWorkingLength = length/4;    DWORD dwResult;
        TCHAR szResult[1024];
        for (int i = 0; i < nWorkingLength; i++)
        {
            dwResult = * (dwData+i); 
            sprintf(szResult,_T("%d:0x%x"),i, dwResult);  //这样的话szResult不也是字符型的吗?
        }[/code]不太清楚你用的什么类.可以指教下吗?
      

  11.   


        ifstream inBin(_T("xxx.bin"),ios::in|ios::binary);  //二进制打开文件
        ASSERT(inBin);  //是否正常打开    int length;
        char * buffer;    
        // get length of file:
        inBin.seekg (0, ios::end); // 这里设置文件指针要怎么理解呀?从0开始,偏移到文件尾吗?
        length = inBin.tellg();  //这!!
        inBin.seekg (0, ios::beg); //文件指针又到开始位置?
        
        // allocate memory:
        buffer = new char [length];
        
        // read data as a block:
        inBin.read (buffer,length);
        DWORD *dwData = (DWORD *)buffer; //这里转换后dwData是个十进制值,不清楚是如何得来的
        int nWorkingLength;
        nWorkingLength = length/4;    DWORD dwResult;
        TCHAR szResult[1024];
        for (int i = 0; i < nWorkingLength; i++)
        {
            dwResult = * (dwData+i); 
            sprintf(szResult,_T("%d:0x%x"),i, dwResult);  //这样的话szResult不也是字符型的吗?
        }
    不太清楚你用的什么类.可以指教下吗?
    我用[C ODE]和[/ C ODE]后代码为什么就没了啊?
      

  12.   

      ifstream inBin(_T("xxx.bin"),ios::in|ios::binary); //二进制打开文件    Yes
      ASSERT(inBin); //是否正常打开  int length;
      char * buffer;  
      // get length of file:
      inBin.seekg (0, ios::end); // 这里设置文件指针要怎么理解呀?从0开始,偏移到文件尾吗?
      length = inBin.tellg(); //这!!
      inBin.seekg (0, ios::beg); //文件指针又到开始位置?        //把文件指针放到end后获取位置,在还原到开始位置已被之后读取做准备
       
      // allocate memory:
      buffer = new char [length];
       
      // read data as a block:
      inBin.read (buffer,length);
      DWORD *dwData = (DWORD *)buffer; //这里转换后dwData是个十进制值,不清楚是如何得来的//指针类型的转换
      int nWorkingLength;
      nWorkingLength = length/4;  DWORD dwResult;
      TCHAR szResult[1024];
      for (int i = 0; i < nWorkingLength; i++)
      {
      dwResult = * (dwData+i); 
      sprintf(szResult,_T("%d:0x%x"),i, dwResult); //这样的话szResult不也是字符型的吗?//类型是表现在输出格式上的也就是字串,计算机中数据都是二进制表示的。
      }
    不太清楚你用的什么类.可以指教下吗?
    我用[C ODE]和[/ C ODE]后代码为什么就没了啊?
      

  13.   

    BYTE buf[4];
    m_File.Read((char *)buf,4);
    DWORD dwVal=buf[0]<<12+buf[1]<<8+buf[2]<<4+buf[3];//dwVal是你要取的16进制值
      

  14.   

    AC 52 1D 67 9B CE BF 11 38 D1 C2 B5
    是字符串还是二进制数据?
    我怎么觉得按照楼主的意思是字符串呢?(用记事本打开看到的东西)
      

  15.   


    像PE格式文件,用记事本打开后不全是乱码么?
    如果用WinHex打开的话,左边的全是以16进制来显示的。
    我想能不能一次读出4字节,例如:第一次读出来的就是0xAC521D67,而不是"AC521D67"