簡體   English   中英

無法在GNU / Linux中讀取二進制視頻文件

[英]Cannot read binary video files in GNU/Linux

我陷入了一段看似無害的代碼。 我正在嘗試將整個flv視頻文件讀取到uint8_t數組中,但無緣無故,只讀取了前10個字節。

contents = malloc(size + 1);

if (read(fd, contents, size) < 0)
{
    free(contents);
    log_message(WARNING, __func__, EMSG_READFILE);
    return (NULL);
}

我也嘗試過使用fopen和“ rb”,但是似乎Glibc忽略了額外的'b'或其他東西。 有什么線索嗎?

提前致謝。

編輯:也許讀取EOF字符?

PS。 'size'是一個使用stat()包含實際文件大小的變量。

看來原始代碼正確地讀取了全部內容。

問題似乎在於使用該二進制數據-打印出來的數據將在第一個null處截斷,從而看起來只有10個字節存在。 您不能使用用於字符串或字符數組的任何方法來輸出二進制數據,因為它們會在第一個空字節處截斷,從而使數組看起來比實際的要短。

看看與查看十六進制數據有關的其他一些問題: 如何在C ++中使用ostream將無符號字符打印為十六進制? 將二進制數據轉換為可打印的十六進制

如果要將此附加到字符串上-采用什么格式? 十六進制? BASE64? 原始字節不起作用。

這是我發布的原始代碼。 一些小的改進,再加上一些更好的診斷代碼:

int ret, size = 4096; /* Probably needs to be much bigger */
uint8_t *contents;
contents = malloc(size + 1);

if(contents == NULL)
{
    log_message(WARNING, __func__, EMSG_MEMORY);
    return (NULL);
}

ret = read(fd, contents, size);
if(ret < 0)
{
    /* Error reading file */
    free(contents);
    log_message(WARNING, __func__, EMSG_READFILE);
    return (NULL);
}

for(i = 0;i < ret;++i)
{
    printf("%c", contents[i]);
    /* printf("%0.2X", (char) contents[i]); /* Alternatively, print in hex */
}

現在,ret真的是10嗎? 還是在嘗試打印輸出時只得到10個字節?

C庫中的“ read()”函數不必一口氣返回整個讀取結果。 實際上,如果您要讀取的數據非常多,通常不會在單個調用中將其提供給您。

解決方案是在循環中調用read(),繼續請求更多數據,直到獲得全部數據為止,或者直到read返回錯誤(由負返回值或文件結尾指示)為止。返回值為零。

如下所示(未試用):

contents = malloc(size + 1);

bytesread = 0;
pos = 0;
while (pos < size && (bytesread = read(fd, contents + pos, size - pos)) > 0)
{
    pos += bytesread;
}

if (bytesread < 0)
{
    free(contents);
    log_message(WARNING, __func__, EMSG_READFILE);
    return (NULL);
}

/* Go on to use 'contents' now, since it's been filled.  Should probably 
   check that pos == size to make sure the file was the size you expected. */

請注意,大多數C程序員在執行此操作時會有所不同,可能使“ pos”成為隨其移動的指針,而不是每次通過循環都偏離“ contents”。 但是我認為這種方法可能更清晰。

成功后, read()返回讀取的字節數(可能少於您要求的字節數,此時應要求其余字節數。)在EOF上,它將返回0,在錯誤時將返回-1。 您可能需要考慮重新發出讀取錯誤(例如,在讀取期間收到信號時發生的EINTR )。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM