简体   繁体   中英

Reading multiple bytes from file and storing them for comparison in C++

I want to binary read a photo in 1460 bytes increments and compare consecutive packets for corrupted transmission. I have a python script that i wrote and want to translate in C++, however I'm not sure that what I intend to use is correct.

for i in range(0, fileSize-1):
    buff=f.read(1460) // buff stores a packet of 1460 bytes where f is the opened file
    secondPacket=''
    for j in buff:
        secondPacket+="{:02x}".format(j)
    if(secondPacket==firstPacket):
        print(f'Packet {i+1} identical with {i}')
    firstPacket=secondPacket

I have found int fseek ( FILE * stream, long int offset, int origin ); but it's unclear if it reads the first byte that is located offset away from origin or everything in between.

Thanks for clarifications.

#include <iostream>
#include <fstream>
#include <array>

std::array<char, 1460> firstPacket;
std::array<char, 1460> secondPacket;
int i=0;

int main() {
    std::ifstream file;
    file.open("photo.jpg", std::ios::binary);

    while (file.read(firstPacket.data(), firstPacket.size())){
        ++i;
        if (firstPacket==secondPacket)
            std::cout<<"Packet "<<i<<" is a copy of packet "<<i-1<<std::endl;
        memcpy(&secondPacket, &firstPacket, firstPacket.size());
    }
    std::cout<<i; //tested to check if i iterate correctly
    return 0;
}

This is the code i have so far which doesn't work.

fseek

doesn't read, it just moves the point where the next read operation should begin. If you read the file from start to end you don't need this.

To read binary data you want the aptly named std::istream::read . You can use it like this wih a fixed size buffer:

// char is one byte, could also be uint8_t, but then you would need a cast later on
std::array<char, 1460> bytes; 


while(myInputStream.read(bytes.data(), bytes.size())) {
    // do work with the read data
}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM