关于Windows BYTE和PBYTES数据类型



什么是"字节";和";PBYTE"用于吗?。我在网上找不到任何信息。

#include <iostream>
#include <Windows.h>
using namespace std;
BYTE by='a';
PBYTE pby= &by;
int main(){

cout<<"by  :  "<<by<<endl;
cout<<"&by :  "<<&by<<endl; // Why doesn't it return the memory address?
cout<<"pby :  "<<pby<<endl;
cout<<"&pby:  "<<&pby;

return 0;
}
The console shows:
by  :  a
&by :  a
pby :  a
&pby:  00007FF6CC10A008

我只是想知道BYTE和PBYTE是用来做什么的。我不明白。由于

BYTE,PBYTE是windows编程中非常古老的样式。例如,如果您想为图像加载程序分配堆内存,您可以写入

unsigned char* img = new unsigned char[1024 * 1024];
load_image(img, ....);
conv_image(img, ....);

但是你的手指会很累,所以你可以写

PBYTE img = new BYTE[1024 * 1024];

是的,微软在20多年前发明了这些定义类型。但是它不便携,不符合标准,会导致内存泄漏,所以在21世纪,你应该按照下面的描述来写。

auto img = make_shared<uint8_t>(1024 * 1024);
or
vector<uint8_t> v(1024 * 1024);
or
array<uint8_t, 1024 * 1024>  a;   // need enough stack memory

什么是"字节";和";PBYTE"用于吗?。我在网上找不到任何信息。

请看这里

BYTE    A byte (8 bits).
This type is declared in WinDef.h as follows:
typedef unsigned char BYTE;
PBYTE   
A pointer to a BYTE.
This type is declared in WinDef.h as follows:
typedef BYTE *PBYTE;

还有std::byte,它记录了:

std::byte是一个不同的类型,它实现了c++语言定义中指定的字节概念。像char和unsigned char一样,它可以用来访问被其他对象占用的原始内存(对象表示),但与这些类型不同的是,它不是字符类型,也不是算术类型。字节只是位的集合,并且只能为其定义按位操作符。

什么是"字节";和";PBYTE"用来做什么的?

BYTEunsigned char的类型别名,PBYTEBYTE *(即unsigned char *)的类型别名。它们在WINAPI中与它们的"真实"类型-unsigned char和指向unsigned char的指针

在你的代码中:

cout << "&by : ";
cout << "&phy : ";

将获取内存中该字符串字面值的指针,并打印出之后的所有字符,直到它达到(这就是以null结尾的字符串的工作方式)。然后,它返回一个basic_ostream<char, _Traits>&,允许您链接多个调用。

调用cout << &by时,调用的是basic_ostream << const unsigned char *__s的重载操作符。如果在代码中再深入一点,

template<typename _Traits> inline basic_ostream<char, _Traits>&
operator<<(basic_ostream<char, _Traits>& ___out, const unsigned char* __s)
{
return (___out << reinterpret_cast<const char*>(__s));
}


您将发现它所做的只是将const unsigned char*转换为const char*(注意unsigned char*如何成为const,因为它是一个全局变量)。换句话说,它的工作原理与cout << reinterpret_cast<const char*>(&by)完全相同,其中程序将&by视为以空结束的字符串。由于堆栈上分配的空间被重置为s,因此by与一个以空结束的单字符长字符串("a")相同。

另一方面,当调用cout << &pby时,调用的是__ostream_type& << const void*的重载操作符。程序将PBYTE *转换为一个void指针,因为PBYTE *(BYTE **)没有重载。在本例中,它只是打印出pby的地址。
__ostream_type& operator<<(const void* __p) {
return _M_insert(__p);
}

最新更新