关于*(DWORD*) 类型转换的问题?

时间:2022-05-07 06:23:59
BYTE* pbBits = (BYTE*)hImage + *(DWORD*)hImage 
hImage 为存放位图的 内存空间,是一个指向字节类型的指针。
请教各位,上面这个公式是什么意思?

尤其*(DWORD*)hImage 的作用是什么?
为什么 还将(BYTE*)hImage  和  *(DWORD*)hImage 加起来?

13 个解决方案

#1


hImage 的前4个字节有重要信息?

#2


还有这样的公式?这个公式是从哪里弄来的?

BYTE* pbBits = (BYTE*)hImage + *(DWORD*)hImage 
(DWORD*)hImage 将hImage转换为DWORD类型指针
 *(DWORD*)hImage 得到hImage(作为指针,假设成立)头4个字节值x

BYTE* pbBits = (BYTE*)hImage + *(DWORD*)hImage hImage指针值,加上偏移量x 作为pbBits 指针的值




#3


这种Image 实际数据位于hImage后面某个位置,
其中hImage位置是一个DWORD类型的偏移量。
实际数据,相对hImage的偏移量,就是该偏移量。

#4


*(DWORD*)himage的意思是把himage指向的内存的前4个字节当成一个DWORD值返回,结果是一个DWORD值。
(BYTE*)himage+ XXX 是计算从himage向后相隔XXX个字节的内存地址。

整个的意思是,himage指向一个数据结构,其中最前边是HEADER, 后边是(位图像素)数据。HEADER的前4个字节是整个HEADER的长度, 这样pbBits计算出来就是指向(位图像素)数据的指针了

#5


代码太多了,我只列出部分关键的代码吧

bool Kirsch(HANDLE hImage)
{
    。。。。。。
     int effwdt = ((((ds.biBitCount * ds.biWidth ) + 31) / 32) * 4);
     BYTE* pbBits = (BYTE*)hImage + *(DWORD*)hImage + ds.biClrUsed * sizeof(RGBQUAD);
     。。。。。
}
其中hImage 是位图图像的数据,只是数据,没有文件头,信息头,颜色表等。函数Kirsch是对图像数据做一些处理。我的理解是:直接读取hImage的数据,进行处理即可。但是,这段代码里,确实这样处理,实在令人费解!感谢楼上的几位的回复,我还是没有想通。。。

#6


你上当了
只是没有文件头,
信息头,颜色表全部都有,只是他把这些数据放到一起了。

哦,有可能也有文件头的一部分;
比如 *(DWORD*)hImage 这个偏移量,
在位图文件中,就位于文件头,是文件头的最后一个数据。 

typedef struct tagBITMAPFILEHEADER { // bmfh 
    WORD    bfType; 
    DWORD   bfSize; 
    WORD    bfReserved1; 
    WORD    bfReserved2; 
    DWORD   bfOffBits; //这个成员,就相当于*(DWORD*)hImage
} BITMAPFILEHEADER; 

具体的说 bfOffBits -sizeof(tagBITMAPFILEHEADER) +sizeof(DWORD) 就等于 *(DWORD*)hImage

#7


哦,上面说的可能,不太对头。
信息头,颜色表和数据,他全都有了。
只是没有文件头
*(DWORD*)hImage 表示数据的实际位置。

#8


BYTE* pbBits = (BYTE*)hImage + *(DWORD*)hImage;

意思就是
pbBits指针等于hImage指针加上hImage前4个字节的内容
如:
hImage的指针内容:
07 00 00 00 06 21 11 01 02 03 04 ....

BYTE* pbBits = (BYTE*)hImage + 7;

pbBits的指针内容就是:
01 02 03 04 ....

#9


*(DWORD *)A等价于((DWORD *)A)[0]

#10


这里 biClrUsed=0
BYTE* pbBits = (BYTE*)pBmpBuf + *(DWORD*)pBmpBuf + biClrUsed * sizeof(RGBQUAD);
等同于 BYTE* pbBits = (BYTE*)pBmpBuf;
通过调试程序,监测变量是这样的结果
*(DWORD*)pBmpBuf 为0,(DWORD*)pBmpBuf 与 pBmpBuf 相同的地址,这个不难理解了,但是为什么*(DWORD*)pBmpBuf 为0 呢?我的这个pBmpBuf 是纯数据,不含文件头,信息头,颜色表等,是从位图中读出的纯数据

#11


还有,
某个函数 aaaa(HANDLE pBmpBuf,int bmpWidth,int bmpHeight,int biBitCount)
这里的 HANDLE pBmpBuf 是什么意思呢? 难道也是 声明一个指针?

#12


。。。。。这个逻辑大概是有问题的把?
hImage 的第一个字节+hImage 的前4个字节,这个数据明显重叠了,难道故意这样设计的么?

#13


引用 12 楼 nice_cxf 的回复:
。。。。。这个逻辑大概是有问题的把?
hImage 的第一个字节+hImage 的前4个字节,这个数据明显重叠了,难道故意这样设计的么?

晕看错,无视12楼

#1


hImage 的前4个字节有重要信息?

#2


还有这样的公式?这个公式是从哪里弄来的?

BYTE* pbBits = (BYTE*)hImage + *(DWORD*)hImage 
(DWORD*)hImage 将hImage转换为DWORD类型指针
 *(DWORD*)hImage 得到hImage(作为指针,假设成立)头4个字节值x

BYTE* pbBits = (BYTE*)hImage + *(DWORD*)hImage hImage指针值,加上偏移量x 作为pbBits 指针的值




#3


这种Image 实际数据位于hImage后面某个位置,
其中hImage位置是一个DWORD类型的偏移量。
实际数据,相对hImage的偏移量,就是该偏移量。

#4


*(DWORD*)himage的意思是把himage指向的内存的前4个字节当成一个DWORD值返回,结果是一个DWORD值。
(BYTE*)himage+ XXX 是计算从himage向后相隔XXX个字节的内存地址。

整个的意思是,himage指向一个数据结构,其中最前边是HEADER, 后边是(位图像素)数据。HEADER的前4个字节是整个HEADER的长度, 这样pbBits计算出来就是指向(位图像素)数据的指针了

#5


代码太多了,我只列出部分关键的代码吧

bool Kirsch(HANDLE hImage)
{
    。。。。。。
     int effwdt = ((((ds.biBitCount * ds.biWidth ) + 31) / 32) * 4);
     BYTE* pbBits = (BYTE*)hImage + *(DWORD*)hImage + ds.biClrUsed * sizeof(RGBQUAD);
     。。。。。
}
其中hImage 是位图图像的数据,只是数据,没有文件头,信息头,颜色表等。函数Kirsch是对图像数据做一些处理。我的理解是:直接读取hImage的数据,进行处理即可。但是,这段代码里,确实这样处理,实在令人费解!感谢楼上的几位的回复,我还是没有想通。。。

#6


你上当了
只是没有文件头,
信息头,颜色表全部都有,只是他把这些数据放到一起了。

哦,有可能也有文件头的一部分;
比如 *(DWORD*)hImage 这个偏移量,
在位图文件中,就位于文件头,是文件头的最后一个数据。 

typedef struct tagBITMAPFILEHEADER { // bmfh 
    WORD    bfType; 
    DWORD   bfSize; 
    WORD    bfReserved1; 
    WORD    bfReserved2; 
    DWORD   bfOffBits; //这个成员,就相当于*(DWORD*)hImage
} BITMAPFILEHEADER; 

具体的说 bfOffBits -sizeof(tagBITMAPFILEHEADER) +sizeof(DWORD) 就等于 *(DWORD*)hImage

#7


哦,上面说的可能,不太对头。
信息头,颜色表和数据,他全都有了。
只是没有文件头
*(DWORD*)hImage 表示数据的实际位置。

#8


BYTE* pbBits = (BYTE*)hImage + *(DWORD*)hImage;

意思就是
pbBits指针等于hImage指针加上hImage前4个字节的内容
如:
hImage的指针内容:
07 00 00 00 06 21 11 01 02 03 04 ....

BYTE* pbBits = (BYTE*)hImage + 7;

pbBits的指针内容就是:
01 02 03 04 ....

#9


*(DWORD *)A等价于((DWORD *)A)[0]

#10


这里 biClrUsed=0
BYTE* pbBits = (BYTE*)pBmpBuf + *(DWORD*)pBmpBuf + biClrUsed * sizeof(RGBQUAD);
等同于 BYTE* pbBits = (BYTE*)pBmpBuf;
通过调试程序,监测变量是这样的结果
*(DWORD*)pBmpBuf 为0,(DWORD*)pBmpBuf 与 pBmpBuf 相同的地址,这个不难理解了,但是为什么*(DWORD*)pBmpBuf 为0 呢?我的这个pBmpBuf 是纯数据,不含文件头,信息头,颜色表等,是从位图中读出的纯数据

#11


还有,
某个函数 aaaa(HANDLE pBmpBuf,int bmpWidth,int bmpHeight,int biBitCount)
这里的 HANDLE pBmpBuf 是什么意思呢? 难道也是 声明一个指针?

#12


。。。。。这个逻辑大概是有问题的把?
hImage 的第一个字节+hImage 的前4个字节,这个数据明显重叠了,难道故意这样设计的么?

#13


引用 12 楼 nice_cxf 的回复:
。。。。。这个逻辑大概是有问题的把?
hImage 的第一个字节+hImage 的前4个字节,这个数据明显重叠了,难道故意这样设计的么?

晕看错,无视12楼