2017-11-09 2 views
1

protobuf 메시지가 잘 설정된 것 같습니다. 다른 모든 필드는 네트워크를 통해 올바르게 전송되고 잘리지 않습니다. 나는 그림이나 파일의 바이너리 데이터를 읽은 다음 바이트 배열 유형으로 Google protobuf를 통해 전송할 때 한 가지 문제 만 있습니다. 반대쪽에는 배열의 처음 4 개 요소 만 포함됩니다. 그림이 200kb라고하면, 다른 쪽 끝은 1kb로 나옵니다 (기본적으로 헤더 또는 식별자 만 포함). 이 문제는 다소 복잡해 지므로 실행을 포기하도록 노력할 것입니다. 미안해. 이해하기가 불가능 해. 나는 완전히 잘못된 방향으로 가고 있을지도 모른다.Google을 통해 이진 파일 데이터 전송하기 Protobuf

  1. 아래의 예는 개념 작업을 포함하고 있으며 수업 시간에 작성되었습니다. 그것은 아주 잘 작은 오류를 포함 할 수 있습니다. 코드가 집에서 컴파일되고 오타가 있으면 알려주고 수정할 수 있습니다.

    FILE* file; 
        FILE* ofile; 
        file = fopen("red.png", "rb"); 
        fseek(file, 0, SEEK_END); 
        long fSize = ftell(file); 
        rewind(file); 
        BYTE* ret = new BYTE[fSize]; 
        fread(ret, 1, fSize, file); 
        fclose(file); 
    
        char dataStream[1024] //yes it is large enough 
        myPacket.set_file(ret); 
        //set other fields here 
        myPacket.SerializeToArray(dataStream,sizeof(dataStream)); 
        //send through sockets below, works for all but file field. 
    

    내 주요 작업을 컴퓨터에 다시 집에 갈 때 더 포함 할 수 있습니다, 죄송합니다, 그냥 클래스에서이 스튜하면서 할 수있는 기대했다. 이 정보가 충분하지 않다면 내게 기분을 풀어 주시고, 조언 만 찾고 계셔도됩니다. 나는 또한 특정 이미지 포맷 특정 방법을 읽을 수 있다는 것을 알고 있지만, 내가 내 의사 책들 읽기 위해 그냥 protobuf 이상,

감사 PNG 파일을 복사하여 로컬 바이너리를 통해 다시 할 수 있었다, I 마침내 내 지식을 향상 시키려고 노력하고 있습니다.

빨리 입력 된 포인터 오류 (& ret)가 (ret)으로 편집되었습니다. 또한 크기가 sizeof (myPacket) 여야합니다.

+1

을 할당합니다. 그리고 그'sizeof (dataStream)'은 1024입니다. – molbdnilo

+0

s /'myPacket.set_file (&ret);'/'myPacket.set_file (ret); ' – user0042

+0

포인터 부분이 잘못 입력되었습니다. 크기가 문제가 될 수 있습니다 – Wilky

답변

1

당신이 쓴이 :

char dataStream[1024] //yes it is large enough 

하지만 그것으로 200 000 바이트를 저장하려면 어떻게 1024 바이트 버퍼 크기가 충분 될 수 있을까?

더 나은와`&, 이미지 데이터에`ret`, 포인터의 차이를 고려 ret`, 당신의 변수에 대한 포인터를 힙에 더 큰 버퍼, 예컨대 :

std::vector<char> dataStream(500000); 
myPacket.SerializeToArray(&dataStream[0], dataStream.size()); 
+0

너무 늦었 어. 고마워. – Wilky

관련 문제