讨教一个fread的问题

C++语言 码拜 7年前 (2017-04-12) 1405次浏览
假设文件内容如下 test.DBF  16进制表示
12 34
然后 unsigned short x;
x的地址是  0001    0002
然后fread from test.dbf
那么x的内容是什么呢? 不管大端CPU还是小端CPU都是如下这样?
0001  12
0002  34
也就是fread的时候从文件读进来的有序的字节流,一定是从低地址开始依次保存的吗?
解决方案

2

No.
Little-Endian: low=12, high = 34;
Big-Endia: low=34, high=12;

1

没有理解
12 34 能放进short型的x中吗?

1

引用:

假设文件内容如下 test.DBF  16进制表示
12 34
然后 unsigned short x;
x的地址是  0001    0002
然后fread from test.dbf
那么x的内容是什么呢? 不管大端CPU还是小端CPU都是如下这样?
0001  12
0002  34
也就是fread的时候从文件读进来的有序的字节流,一定是从低地址开始依次保存的吗?

题主的理解是对的,和大端小端无关,文件里是 12 34 读进内存就是12 34
不同的是大端和小端对 12 34 作为short的解释不同

/**
 * @file        demo.c
 * @brief
 */
#include <stdio.h>
int
main(int argc, char *argv[])
{
        FILE *fp;
        unsigned char buf[2] = {0x12, 0x34};
        unsigned char *ptr;
        short x;
        fp = fopen("demo.dat", "wb");
        fwrite(buf, 1, 2, fp);
        fclose(fp);
        fp = fopen("demo.dat", "rb");
        fread(&x, 1, 2, fp);
        fclose(fp);
        ptr = (unsigned char *)&x;
        printf("%05d %04x, %02x%02x\n", (int)x, (int)x, ptr[0], ptr[1]);
        return 0;
}

小端:
$ uname -msvp; ./demo
Linux #1 SMP Tue May 10 15:42:40 EDT 2011 x86_64 x86_64
13330 3412, 1234
大端:
$ uname -msvp; ./demo
AIX 6 00F8359A4C00 powerpc
04660 1234, 1234

2

请将这句话默念千遍,其义自现:

电脑内存或文件内容只是一个一维二进制字节数组及其对应的二进制地址;
人脑才将电脑内存或文件内容中的这个一维二进制字节数组及其对应的二进制地址的某些部分看成是整数、有符号数/无符号数、浮点数、复数、英文字母、阿拉伯数字、中文/韩文/法文……字符/字符串、汇编指令、函数、函数参数、堆、栈、数组、指针、数组指针、指针数组、数组的数组、指针的指针、二维数组、字符点阵、字符笔画的坐标、黑白二值图片、灰度图片、彩色图片、录音、视频、指纹信息、身份证信息……

讨教一个fread的问题讨教一个fread的问题讨教一个fread的问题讨教一个fread的问题讨教一个fread的问题讨教一个fread的问题讨教一个fread的问题讨教一个fread的问题讨教一个fread的问题讨教一个fread的问题讨教一个fread的问题讨教一个fread的问题讨教一个fread的问题讨教一个fread的问题讨教一个fread的问题

2

所谓大端/小端只是针对cpu寄存器来说,例如EAX寄存器可以认为是AX寄存器+AH寄存器+AL寄存串联在一起,同时你也可以认为寄存器是内部cache内存的映射,所以也有地址高低,小端的串联方式从低地址到高地址是AL+AH+AX, 大端的是AX+AH+AL。
所谓的EAX=0X12345678只是编译器为了便于方便程序员特设的,因本人我们平时写阿拉伯数字都是大数字·写在左边小数字写在右边,和真正的存储位置没关系。·

2

fread只是把文件中的字节流拷贝到内存中,顺序当然不会变。
怎么去解释内存中的数才是大端小端的区别。

2

引用:
Quote: 引用:

假设文件内容如下 test.DBF  16进制表示
12 34
然后 unsigned short x;
x的地址是  0001    0002
然后fread from test.dbf
那么x的内容是什么呢? 不管大端CPU还是小端CPU都是如下这样?
0001  12
0002  34
也就是fread的时候从文件读进来的有序的字节流,一定是从低地址开始依次保存的吗?

题主的理解是对的,和大端小端无关,文件里是 12 34 读进内存就是12 34
不同的是大端和小端对 12 34 作为short的解释不同

/**
 * @file        demo.c
 * @brief
 */
#include <stdio.h>
int
main(int argc, char *argv[])
{
        FILE *fp;
        unsigned char buf[2] = {0x12, 0x34};
        unsigned char *ptr;
        short x;
        fp = fopen("demo.dat", "wb");
        fwrite(buf, 1, 2, fp);
        fclose(fp);
        fp = fopen("demo.dat", "rb");
        fread(&x, 1, 2, fp);
        fclose(fp);
        ptr = (unsigned char *)&x;
        printf("%05d %04x, %02x%02x\n", (int)x, (int)x, ptr[0], ptr[1]);
        return 0;
}

小端:
$ uname -msvp; ./demo
Linux #1 SMP Tue May 10 15:42:40 EDT 2011 x86_64 x86_64
13330 3412, 1234
大端:
$ uname -msvp; ./demo
AIX 6 00F8359A4C00 powerpc
04660 1234, 1234

写进去内存是   {0x12,34}
读出来内存肯定也是  {0x12,34}
只不过,把两个字节看成是shot的话
就跟CPU的大小端有关系了
小端
低对低,高对高      0x3412
大端反之                  0x1234
这回应该没错了,还是把问题搞得简单化吧
别把问题搞复杂了,头晕

2

12 34
公说是1234,婆说是3412
哥说是0x1234,姐说是0x3412
弟说是阿拉伯数字,妹说是12和34
本人说是液晶,他说是原子和电子。
外星人说是乱码。
到底谁对谁错呢?

2

引用:
Quote: 引用:
Quote: 引用:
Quote: 引用:

假设文件内容如下 test.DBF  16进制表示
12 34
然后 unsigned short x;
x的地址是  0001    0002
然后fread from test.dbf
那么x的内容是什么呢? 不管大端CPU还是小端CPU都是如下这样?
0001  12
0002  34
也就是fread的时候从文件读进来的有序的字节流,一定是从低地址开始依次保存的吗?

题主的理解是对的,和大端小端无关,文件里是 12 34 读进内存就是12 34
不同的是大端和小端对 12 34 作为short的解释不同

/**
 * @file        demo.c
 * @brief
 */
#include <stdio.h>
int
main(int argc, char *argv[])
{
        FILE *fp;
        unsigned char buf[2] = {0x12, 0x34};
        unsigned char *ptr;
        short x;
        fp = fopen("demo.dat", "wb");
        fwrite(buf, 1, 2, fp);
        fclose(fp);
        fp = fopen("demo.dat", "rb");
        fread(&x, 1, 2, fp);
        fclose(fp);
        ptr = (unsigned char *)&x;
        printf("%05d %04x, %02x%02x\n", (int)x, (int)x, ptr[0], ptr[1]);
        return 0;
}

小端:
$ uname -msvp; ./demo
Linux #1 SMP Tue May 10 15:42:40 EDT 2011 x86_64 x86_64
13330 3412, 1234
大端:
$ uname -msvp; ./demo
AIX 6 00F8359A4C00 powerpc
04660 1234, 1234

写进去内存是   {0x12,34}
读出来内存肯定也是  {0x12,34}
只不过,把两个字节看成是shot的话
就跟CPU的大小端有关系了
小端
低对低,高对高      0x3412
大端反之                  0x1234
这回应该没错了,还是把问题搞得简单化吧
别把问题搞复杂了,头晕

谢谢高手,本人想讨教的是,假如fread到short 变量的时候
假如文本是  12  34
那么short变量地址从小到大,也是  12  34 ? 还是 34 12?

是的   short变量地址从小到大   12  34

2

1、fread的时候,字节在变量地址里是按照什么顺序存放进去的?
按照fread进来的顺序,不管变量是任何类型,例如char[] int等,不管是大端还是小端
都是从低地址到高地址依次存放字节?
A1:是
2、给变量赋值,例如 short int X=0x1234 那么这2个字节在内存里又是怎么存放的呢?大小端不一样?
小端CPU:34 12;大端CPU:12 34
3、CPU是按照什么顺序怎么解读的?
小端CPU按照小端顺序解读,大端CPU按照大端顺序解读。(感觉这是一句彻头彻尾的废话!讨教一个fread的问题
说简单就是,写入内存的顺序是怎么的? 从内存读取的时候,CPU是按照什么顺序读取的?
CPU按照什么顺序写入和读取都不打紧,关键是CPU是按照大端还是按照小端的约定对这个多字节拼接成的数进行加减乘除……运算。

2

引用:
Quote: 引用:

fread只是把文件中的字节流拷贝到内存中,顺序当然不会变。
怎么去解释内存中的数才是大端小端的区别。

高手,本人想问的是,fread到不同理性变量的时候,是按什么顺序保存的
char似乎就是原始顺序,int就不一定了

你看fread的参数:
size_t fread( void *buffer, size_t size, size_t count, FILE *stream );
buffer跟数据类型有关么?
文件里面的字节流是什么顺序,拷贝到内存就是什么顺序啊,这个跟数据类型和大端小端都没关系。
假如有关的话,C语言还能跨平台么?

2

举例:
请将下面这四个字节对应的unsigned short int的和对应的低16位填写在它们后面:
56 78 AB CD
小端:
0x7856+0xCDAB=0x14601
结果:56 78 AB CD 01 46
大端
0x5678+0xABCD=0x10245
结果:56 78 AB CD 02 45
看看它俩的结果区别有多大!讨教一个fread的问题

2

赵4老师的回复太逗

2

题主这样吧,本人感觉你大端小端都已经搞糊涂了,
我们先把小端的先搞搞明白行吗
实在不行了,本人只能把本人的视频教程公开了,看一下把,http://vs2003.net/

2

引用:
Quote: 引用:

题主这样吧,本人感觉你大端小端都已经搞糊涂了,
我们先把小端的先搞搞明白行吗
实在不行了,本人只能把本人的视频教程公开了,看一下把,http://vs2003.net/

多谢老师,可是您的“05.查看int中的每个字节的内容“好像没视频啊

第三部分

2

引用:
Quote: 引用:
Quote: 引用:
Quote: 引用:

题主这样吧,本人感觉你大端小端都已经搞糊涂了,
我们先把小端的先搞搞明白行吗
实在不行了,本人只能把本人的视频教程公开了,看一下把,http://vs2003.net/

多谢老师,可是您的“05.查看int中的每个字节的内容“好像没视频啊

第三部分

谢谢henry老师,
能不能帮本人鉴定一下,本人这样写能否就不用管大小端了,或说本人那样写能否就是大小端通用了?
http://bbs.csdn.net/topics/390836155?page=1#post-397789289

本人家没有大端机器,没有进行过科学的实验,也不好说啥,
问题可以回避的,直接用字符串存储信息,那就OK了
本人之前一家公司,网络传输全是用了字符串,很神奇
记住一点吧,写进去是啥,读出来也肯定是啥
但是由于CPU的不一样
就好比人的大脑结构不一样
老是黑板上面也了一个数字   1234
小A  就是喜欢从左到右去读   那就是1234
小B 的大脑设计比较奇怪,   就觉的这个数字是 4321   ,他觉得一切数字都是应该从右到左边读的
老师写的字就好比是内存中的字节    低地址–》高地址  1234


CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明讨教一个fread的问题
喜欢 (0)
[1034331897@qq.com]
分享 (0)