能力值:
( LV2,RANK:10 )
|
-
-
2 楼
BYTE[2] == unsigned char[2]
|
能力值:
( LV5,RANK:60 )
|
-
-
3 楼
FILE * fp = fopen("***.dat", "rb");
if(!fp)
{return ;}
int *pSize = new int[1];
memset(pSize, 0, 4);
fread(pSize, 1, 2, fp);
fclose(fp);
int i = *pSize;
别忘记释放pSize,没有检查代码,随手写的。大概这样就可以了
|
能力值:
( LV4,RANK:50 )
|
-
-
4 楼
unsigned short int nStructLen;
|
能力值:
( LV3,RANK:20 )
|
-
-
5 楼
2L,4L看不懂。。。
3L麻烦解释下,我相当小白啊
int *pSize = new int[1];
memset(pSize, 0, 4);
UE打开那个文件,头2个字节时00 19,老师说其代表大小就是25,用3L的方法显示为6400。。。
|
能力值:
( LV4,RANK:50 )
|
-
-
6 楼
short int 就是相当于int的一半长度,也就是2字节
大小不为负数,所以加一个unsigned,这个可以看你个人喜好去加了
|
能力值:
( LV5,RANK:60 )
|
-
-
7 楼
[QUOTE=gerrardgld;820341]2L,4L看不懂。。。
3L麻烦解释下,我相当小白啊
int *pSize = new int[1];
memset(pSize, 0, 4);
UE打开那个文件,头2个字节时00 19,老师说其代表大小就是25,用3L的方法显示为6400。。。[/QUOTE]
一般的00 19,应该是1900H,也就是十进制的6400。但是你们老师说是25,应该是0019H。
说明顺序跟一般的不同。那就转换一下,在fread之后,
FILE * fp = fopen("***.dat", "rb");
if(!fp)
{return ;}
char *pSize = (char *)new int[1];
memset(pSize, 0, 4);
fread(pSize, 1, 2, fp);
BYTE bTemp = 0;
memcpy(&bTemp, pSize, 1);
memcpy(pSize, pSize + 1, 1);
memcpy(pSize + 1, &bTemp, 1);
fclose(fp);
int i = *(int *)pSize;
这样有些麻烦,可能有更为简单的方法~
|
能力值:
( LV3,RANK:20 )
|
-
-
8 楼
typedef char INT1;
typedef unsigned char UINT1;
typedef unsigned short UINT2;
typedef unsigned long UINT4;
#define MC_GET_CHAR(__data__) (*((char *)(__data__)))
#define MC_GET_SHORT(__data__) ((UINT2)(( ((UINT2)(*((char *)(__data__))))<<8 )|( ((UINT2)(*((char *)(__data__)+1)))&0x00ff )))
#define MC_GET_LONG(__data__) ( ( ((UINT4)MC_GET_SHORT((__data__)))<<16 )|( ((UINT4)MC_GET_SHORT((char *)(__data__)+2))&0x0000ffff ) )
#define MC_GET_3BN(__data__) ( ( ((UINT4)MC_GET_CHAR((__data__)))<<16 )|( ((UINT4)MC_GET_SHORT((char *)(__data__)+1))&0x0000ffff ) )
——————————————————————————————————————————————
#include <string.h>
#include <stdio.h>
#include <windows.h>
#include "Macro.h"
void main()
{
int i;
char buff[2];
FILE*fp;
fp=fopen("*.dat","r+");
fscanf(fp,"%2c",buff);
i=MC_GET_SHORT(buff);
printf("%d\n",i);
}
ultraedit打开.dat文件显示开头俩个字节是00 19,然后用上述代码读就时25了,你们觉得这代码有问题么?
难道不应该时倒序么?00 19即1900H?
|
能力值:
( LV5,RANK:60 )
|
-
-
9 楼
“typedef char INT1;
typedef unsigned char UINT1;
typedef unsigned short UINT2;
typedef unsigned long UINT4;
#define MC_GET_CHAR(__data__) (*((char *)(__data__)))
#define MC_GET_SHORT(__data__) ((UINT2)(( ((UINT2)(*((char *)(__data__))))<<8 )|( ((UINT2)(*((char *)(__data__)+1)))&0x00ff )))
#define MC_GET_LONG(__data__) ( ( ((UINT4)MC_GET_SHORT((__data__)))<<16 )|( ((UINT4)MC_GET_SHORT((char *)(__data__)+2))&0x0000ffff ) )
#define MC_GET_3BN(__data__) ( ( ((UINT4)MC_GET_CHAR((__data__)))<<16 )|( ((UINT4)MC_GET_SHORT((char *)(__data__)+1))&0x0000ffff ) )
——————————————————————————————————————————————
#include <string.h>
#include <stdio.h>
#include <windows.h>
#include "Macro.h"
void main()
{
int i;
char buff[2];
FILE*fp;
fp=fopen("*.dat","r+");
fscanf(fp,"%2c",buff);
i=MC_GET_SHORT(buff);
printf("%d\n",i);
}
ultraedit打开.dat文件显示开头俩个字节是00 19,然后用上述代码读就时25了,你们觉得这代码有问题么?
难道不应该时倒序么?00 19即1900H?”
buff读出来就是00 19,这个是16进制的。如果我们用short来访问,就是1900H(倒序)。
(UINT2)(( ((UINT2)(*((char *)(__data__))))<<8 )假如把buff传进去,经过这个变换成为了一个值为0x0000的数。而( ((UINT2)(*((char *)(__data__)+1)))&0x00ff ))经过这个变换成为了一个值为0x1900的数。两个数做“或”运算,i在内存中就变成了19 00,因为i是int,应该是4个字节,采用倒序就成了** ** 00 19H。**表示未知,因为你不知道那块内存存的是什么,int i定义是你并没有初始化为零。所以建议你最好跟踪一下程序,然后看一下内存就明白了。int i最好换成short int
|
能力值:
( LV3,RANK:20 )
|
-
-
10 楼
谢谢各位了,虽然还是有点迷糊。。。
|
|
|