首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >返回负值的二进制文件的填充

返回负值的二进制文件的填充
EN

Stack Overflow用户
提问于 2019-08-03 16:36:48
回答 4查看 922关注 0票数 0

我正在设置指向同一个文件的3个指针,每个指针将在不同的偏移量中工作。我需要每次从它们中读取一个字节。但是第二个指针的fread总是显示一个负值。

代码语言:javascript
复制
int main(void) {
    unsigned int y; 
    unsigned int u; 
    unsigned int v; 
    FILE *yPtr;
    FILE *uPtr;
    FILE *vPtr;
    yPtr = fopen ( "test.bin", "rb"); 
    uPtr = fopen ( "test.bin", "rb"); 
    vPtr = fopen ( "test.bin", "rb"); 
    fread(&y,1,1,yPtr);
    fread(&u,1,1,uPtr); 
    fread(&v,1,1,vPtr);

    printf("%x ", y);
    printf("%x ", u);
    printf("%x ", v);

}

我希望:“9f9f9f”,但输出是:"9f ffffcc9f 9f“。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2019-08-03 17:06:35

在此:

代码语言:javascript
复制
unsigned int y; /* unintialized, default contains garbage data due to automatic storage */

在32位系统中,为y保留了4个字节的内存.看起来像是

代码语言:javascript
复制
 0x100   0x101    0x102   0x103      let's assume base address of y is 0x100
-----------------------------------
|   G   |   G     |  G     |   G  |  G- garbage
-----------------------------------
y
LSb-->                 

还有这里

代码语言:javascript
复制
fread(&y,1,1,yPtr);

fread()只从yPtr读取1字节并存储到y中。现在看起来就像

代码语言:javascript
复制
0x100               0x101    0x102   0x103  
--------------------------------------------
|   valid value   |   G     |  G     |   G  |  G- garbage
--------------------------------------------
y

因此,除了第一个字节,其余的字节仍然包含一些中间值。

正确是

代码语言:javascript
复制
fread(&y, 4, 1, yPtr); /* read 4 bytes */

或者首先初始化变量。例如,

代码语言:javascript
复制
unsigned int y = 0; /* now if only first byte overwritten, remaining byte contents will be zero */ 

或者,如果应用程序的目的是只读取1字节,则使用unsigned char类型而不是unsigned long类型。如:

代码语言:javascript
复制
unsigned char y = 0;

同样适用于其他变量uv &各自的fread()语句。还要检查库函数fopen()fread()的返回值。

票数 3
EN

Stack Overflow用户

发布于 2019-08-03 16:45:25

unsigneds通常是4-8字节.您只需将1字节读入它们,剩下的就不确定了。

如果您只想读取一个字节,则应该将其读入unsigned char中。

如果您想继续使用unsigned ints,您可以对它们进行预零,然后如果您在一个2的补码机上,就会得到您想要的结果。

在实际代码中,您还应该检查返回值(至少对于fopenfread)。

票数 4
EN

Stack Overflow用户

发布于 2019-08-03 16:56:51

试试下面的代码。

似乎您正在编写一个大于1字节值的值(取决于CPU),而这个值没有初始化。

一个未签名的字符是1字节,所以您应该不会遇到任何问题:

代码语言:javascript
复制
int main(void) {
    unsigned char y = 0, u = 0, v = 0; 

    FILE *yPtr, *uPtr, *vPtr;
    yPtr = fopen ("test.bin","rb"); 
    uPtr = fopen ("test.bin","rb"); 
    vPtr = fopen ("test.bin","rb"); 

    fread(&y,1,1,yPtr);
    fread(&u,1,1,uPtr); 
    fread(&v,1,1,vPtr);

    printf("%x %x %x", y, u, v);
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57340253

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档