9月20日学习记录

通过下面的代码可以实现使用c++快速获得uuid:

使用chatgpt生成的:

#include <WinSock2.h>
#include <windows.h>
#include <Wbemidl.h>
#include <iostream>
#include <DXGI.h>
#include <comdef.h>
#include <iostream>
#include <QDebug>
using namespace std;
#pragma comment(lib,"DXGI.lib")
#pragma warning(disable: 4996)
#pragma comment(lib, "wbemuuid.lib")QString getMachineUUID()
{QString uuid = "";HRESULT hres = CoInitializeEx(0, COINIT_APARTMENTTHREADED);if ((hres != RPC_E_TOO_LATE) && (hres != RPC_E_NO_GOOD_SECURITY_PACKAGES) && FAILED(hres)){qDebug() << "Failed to initialize security. "<< "Error code = 0x"<< hex << hres << endl;CoUninitialize();return uuid;}hres = CoInitializeSecurity(NULL,-1,                          // COM authenticationNULL,                        // Authentication servicesNULL,                        // ReservedRPC_C_AUTHN_LEVEL_DEFAULT,   // Default authenticationRPC_C_IMP_LEVEL_IMPERSONATE, // Default ImpersonationNULL,                        // Authentication infoEOAC_NONE,                   // Additional capabilitiesNULL                         // Reserved);if ((hres != RPC_E_TOO_LATE) && FAILED(hres)){qDebug() << "Failed to initialize security. Error code = 0x"<< hex << hres << endl;CoUninitialize();return uuid;                    // Program has failed.}// Step 3: ---------------------------------------------------// Obtain the initial locator to WMI -------------------------IWbemLocator* pLoc = NULL;hres = CoCreateInstance(CLSID_WbemLocator,0,CLSCTX_INPROC_SERVER,IID_IWbemLocator, (LPVOID*)&pLoc);if (FAILED(hres)){qDebug() << "Failed to create IWbemLocator object."<< " Err code = 0x"<< hex << hres << endl;CoUninitialize();return uuid;                 // Program has failed.}// Step 4: -----------------------------------------------------// Connect to WMI through the IWbemLocator::ConnectServer methodIWbemServices* pSvc = NULL;// Connect to the root\cimv2 namespace with// the current user and obtain pointer pSvc// to make IWbemServices calls.hres = pLoc->ConnectServer(_bstr_t(L"ROOT\\CIMV2"), // Object path of WMI namespaceNULL,                    // User name. NULL = current userNULL,                    // User password. NULL = current0,                       // Locale. NULL indicates currentNULL,                    // Security flags.0,                       // Authority (e.g. Kerberos)0,                       // Context object&pSvc                    // pointer to IWbemServices proxy);if (FAILED(hres)){qDebug() << "Could not connect. Error code = 0x"<< hex << hres << endl;pLoc->Release();CoUninitialize();return uuid;                // Program has failed.}//cout << "Connected to ROOT\\CIMV2 WMI namespace" << endl;// Step 5: --------------------------------------------------// Set security levels on the proxy -------------------------hres = CoSetProxyBlanket(pSvc,                        // Indicates the proxy to setRPC_C_AUTHN_WINNT,           // RPC_C_AUTHN_xxxRPC_C_AUTHZ_NONE,            // RPC_C_AUTHZ_xxxNULL,                        // Server principal nameRPC_C_AUTHN_LEVEL_CALL,      // RPC_C_AUTHN_LEVEL_xxxRPC_C_IMP_LEVEL_IMPERSONATE, // RPC_C_IMP_LEVEL_xxxNULL,                        // client identityEOAC_NONE                    // proxy capabilities);if (FAILED(hres)){cout << "Could not set proxy blanket. Error code = 0x"<< hex << hres << endl;pSvc->Release();pLoc->Release();CoUninitialize();return uuid;               // Program has failed.}// Step 6: --------------------------------------------------// Use the IWbemServices pointer to make requests of WMI ----// For example, get the name of the operating systemIEnumWbemClassObject* pEnumerator = NULL;hres = pSvc->ExecQuery(bstr_t("WQL"),bstr_t("SELECT UUID FROM Win32_ComputerSystemProduct"),WBEM_FLAG_FORWARD_ONLY | WBEM_FLAG_RETURN_IMMEDIATELY,NULL,&pEnumerator);if (FAILED(hres)){qDebug() << "Query for operating system name failed."<< " Error code = 0x"<< hex << hres << endl;pSvc->Release();pLoc->Release();CoUninitialize();return uuid;               // Program has failed.}// Step 7: -------------------------------------------------// Get the data from the query in step 6 -------------------IWbemClassObject* pclsObj;ULONG uReturn = 0;while (pEnumerator){HRESULT hr = pEnumerator->Next(WBEM_INFINITE, 1,&pclsObj, &uReturn);if (FAILED(hr) || 0 == uReturn){break;}VARIANT vtProp;// Get the value of the Name property/*hr = pclsObj->Get(L"VolumeName", 0, &vtProp, 0, 0);wcout << " VolumeName : " << vtProp.bstrVal << endl;VariantClear(&vtProp);*/if (FAILED(pclsObj->Get(L"UUID", 0, &vtProp, 0, 0))){qDebug() << "The specified property is not found." << endl;}else{qDebug() << vtProp.bstrVal << endl;QString q_str((QChar*)vtProp.bstrVal, wcslen(vtProp.bstrVal));uuid = q_str;}pclsObj->Release();}// Cleanup// ========pSvc->Release();pLoc->Release();pEnumerator->Release();// pclsObj->Release();CoUninitialize();qDebug() << "uuid: " << uuid << endl;return uuid;
}

速度在75ms

通过下面博客的代码可以实现获得CPUID:

【C/C++】获取计算机CPUID序列号_c++ 获取cpu序列号-CSDN博客

std::string GetId()
{std::string strCPUId;unsigned long s1, s2;char buf[32] = { 0 };__asm{mov eax, 01hxor edx, edxcpuidmov s1, edxmov s2, eax}if (s1){memset(buf, 0, 32);sprintf_s(buf, 32, "%08X", s1);strCPUId += buf;}if (s2){memset(buf, 0, 32);sprintf_s(buf, 32, "%08X", s2);strCPUId += buf;}__asm{mov eax, 03hxor ecx, ecxxor edx, edxcpuidmov s1, edxmov s2, ecx}if (s1){memset(buf, 0, 32);sprintf_s(buf, 32, "%08X", s1);strCPUId += buf;}if (s2){memset(buf, 0, 32);sprintf_s(buf, 32, "%08X", s2);strCPUId += buf;}return strCPUId;
}

使用该函数将string转为QString

QString::fromStdString(GetCPUId()); 

时间消耗: 

#include <iostream>
#include <windows.h>int main() {HKEY hKey;if (RegOpenKeyEx(HKEY_LOCAL_MACHINE, "SOFTWARE\\Microsoft\\Cryptography", 0, KEY_READ, &hKey) == ERROR_SUCCESS) {BYTE data[100];DWORD dataSize = sizeof(data);if (RegQueryValueEx(hKey, "MachineGuid", NULL, NULL, data, &dataSize) == ERROR_SUCCESS) {std::string machineGUID(reinterpret_cast<char*>(data));std::cout << "MachineGUID: " << machineGUID << std::endl;}RegCloseKey(hKey);}return 0;
}

Time elapsed: 24600 ns
Time elapsed: 0 ms

 chatgpt真的很好用

获取MachineGUID

Windows API 获取MachineGUID_浇糖玛奇朵的博客-CSDN博客

(1)64位程序,64位电脑 

#include <Windows.h>
#include <string>
#include <iostream>
int main()
{std::string sub_key = "SOFTWARE\\Microsoft\\Cryptography";std::string name = "MachineGuid";HKEY hKey;DWORD dwType = REG_SZ;DWORD dwLen = MAX_PATH;if (RegOpenKeyA(HKEY_LOCAL_MACHINE, sub_key.c_str(), &hKey) == ERROR_SUCCESS) {std::cout << "ok\n";}unsigned char buf[100];PLONG data = 0;if (RegQueryValueExA(hKey, name.c_str(), 0, &dwType, (LPBYTE)buf, &dwLen) == ERROR_SUCCESS) {std::cout << "ok\n";}else std::cout << "GetLastError() = " << GetLastError() << std::endl;std::cout << buf << std::endl;return 0;
}

注意:

我的电脑是64位的,所以我的程序也得是64位才行,才能正确获得结果,否则,就访问失败。

这是一个非常重要的点,,,让我在坑里爬不出来。

【小沐学C++】C++ 访问注册表(64位系统)_c++ 32位及64位 注册表读写_爱看书的小沐的博客-CSDN博客

64位系统注册表分32位注册表项和64位注册表项两部分。

64位系统中,通过regedit中查看指定路径下的注册表项均为64位注册表项。

而32位注册表项被重定位到:HKEY_LOCAL_MACHINE\Software\WOW6432Node

(2) 写成下面这样就可以在32位应用程序中访问64位的注册表了。

#include <Windows.h>
#include <string>
#include <iostream>
int main()
{std::string name = "MachineGuid";HKEY hKey;DWORD dwType = REG_SZ;DWORD dwLen = MAX_PATH;if (RegOpenKeyEx(HKEY_LOCAL_MACHINE, L"SOFTWARE\\Microsoft\\Cryptography",0, KEY_READ | KEY_WOW64_64KEY, &hKey) == ERROR_SUCCESS){std::cout << "ok\n";}unsigned char buf[100];PLONG data = 0;if (RegQueryValueExA(hKey, name.c_str(), 0, &dwType, (LPBYTE)buf, &dwLen) == ERROR_SUCCESS) {std::cout << "ok\n";}else std::cout << "GetLastError() = " << GetLastError() << std::endl;std::cout << buf << std::endl;return 0;
}

关键:KEY_WOW64_64KEY,它可以使32位程序访问64位系统的64位注册表。

(3)封装一下:

QString getMachineGUID()
{std::string name = "MachineGuid";HKEY hKey;DWORD dwType = REG_SZ;DWORD dwLen = MAX_PATH;if (RegOpenKeyEx(HKEY_LOCAL_MACHINE, L"SOFTWARE\\Microsoft\\Cryptography",0, KEY_READ | KEY_WOW64_64KEY, &hKey) == ERROR_SUCCESS){std::cout << "ok\n";}unsigned char buf[100];PLONG data = 0;if (RegQueryValueExA(hKey, name.c_str(), 0, &dwType, (LPBYTE)buf, &dwLen) == ERROR_SUCCESS) {std::cout << "ok\n";}else std::cout << "GetLastError() = " << GetLastError() << std::endl;QString qstr = "";char* p = (char*)buf;qstr = qstr.append(p);qDebug() << qstr;return qstr;
}

花费时间: 

Time elapsed: 149100 ns
Time elapsed: 0 ms

(4)Qt中获取MachineGuid

 计算机\HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Cryptography

如果是Qt5.7以上的版本,

系统是64位,程序是32位,

可以使用下面文章的方法。

QSettings读取注册表失败_qsettings::registry64format_蓝黑墨水的博客-CSDN博客

    QSettings settings("HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Cryptography",QSettings::Registry64Format);QString value = settings.value("MachineGuid", "").toString();//读qDebug()<<value;

 主板ID(又名BIOS-ID):

  (又名主板序列号)

BIOS:basic input output system:

它本身是代码段,作为开机之后,CPU要进行处理的第一个“可执行程序”,也就是第一个“开机启动项。

cmd.exe中查询:

wmic baseboard get serialnumber

方法1:

VC++ 通过wmic获取主板和BIOS序列号_c++ wmic_老狼主的博客-CSDN博客

std::string GetHardwareSerialNumber()
{std::string sResult;const long COMMAND_SIZE = 1020;const DWORD WAIT_TIME = 1000; // INFINITE// 获取主板序列号char str1[] = "wmic BaseBoard get SerialNumber";TCHAR szFetCmd[100];MultiByteToWideChar(CP_ACP, 0, str1, -1, szFetCmd, 100);const std::string strEnSearch = "SerialNumber";    // 前导信息// 获取BIOS序列号//TCHAR szFetCmd[] = _T("wmic bios get serialnumber");// 命令行//const std::string strEnSearch = "SerialNumber";    // 前导信息// 获取CPU序号名//TCHAR szFetCmd[] = "wmic cpu get processorid";  // 命令行//const string strEnSearch = "ProcessorId";       // 前导信息BOOL bReturnCode = FALSE;HANDLE hReadPipe = NULL;  // Pipeline for READHANDLE hWritePipe = NULL; // Pipeline for WRITEPROCESS_INFORMATION pi;   // Process informationSTARTUPINFO         si;   // Control-command window infoSECURITY_ATTRIBUTES sa;   // Security attributeschar szBuffer[COMMAND_SIZE + 1] = { 0 }; // Command line output bufferstd::string strBuffer;DWORD count = 0;size_t pos = 0;size_t i = 0;size_t j = 0;char* lpszBaseBoard = (char*)malloc((COMMAND_SIZE + 1) * sizeof(char));memset(lpszBaseBoard, 0x00, (COMMAND_SIZE + 1) * sizeof(char));memset(&pi, 0, sizeof(pi));memset(&si, 0, sizeof(si));memset(&sa, 0, sizeof(sa));pi.hProcess = NULL;pi.hThread = NULL;si.cb = sizeof(STARTUPINFO);sa.nLength = sizeof(SECURITY_ATTRIBUTES);sa.lpSecurityDescriptor = NULL;sa.bInheritHandle = TRUE;bReturnCode = CreatePipe(&hReadPipe, &hWritePipe, &sa, 0);if (!bReturnCode)goto EXIT;GetStartupInfo(&si);si.hStdError = hWritePipe;si.hStdOutput = hWritePipe;si.wShowWindow = SW_HIDE; // hide command line windowsi.dwFlags = STARTF_USESHOWWINDOW | STARTF_USESTDHANDLES;bReturnCode = CreateProcess(NULL, szFetCmd, NULL, NULL, TRUE, 0, NULL, NULL, &si, &pi);if (!bReturnCode)goto EXIT;WaitForSingleObject(pi.hProcess, WAIT_TIME);bReturnCode = ReadFile(hReadPipe, szBuffer, COMMAND_SIZE, &count, 0);if (!bReturnCode)goto EXIT;bReturnCode = FALSE;strBuffer = szBuffer;pos = strBuffer.find(strEnSearch);if (pos < 0) // NOT FOUNDgoto EXIT;elsestrBuffer = strBuffer.substr(pos + strEnSearch.length());memset(szBuffer, 0x00, sizeof(szBuffer));strcpy_s(szBuffer, strBuffer.c_str());j = 0;for (i = 0; i < strlen(szBuffer); i++){if (szBuffer[i] != ' ' && szBuffer[i] != '\n' && szBuffer[i] != '\r'){lpszBaseBoard[j] = szBuffer[i];j++;}}sResult = lpszBaseBoard;bReturnCode = TRUE;EXIT:free(lpszBaseBoard);CloseHandle(hWritePipe);CloseHandle(hReadPipe);CloseHandle(pi.hProcess);CloseHandle(pi.hThread);return sResult;
}

 耗时:

Time elapsed: 1431615600 ns
Time elapsed: 1431 ms

方法2:

chatgpt生成

int GetSerialNumber()
{FILE* cmd = _popen("wmic baseboard get serialnumber", "r");if (cmd == NULL) {printf("Failed to execute command.\n");return 1;}char buffer[256];while (fgets(buffer, sizeof(buffer), cmd) != NULL) {printf("%s", buffer);}_pclose(cmd);
}
Time elapsed: 2949781600 ns
Time elapsed: 2949 ms

 获取软件信息

Qt 获取当前计算机已安装的软件(注册表方式)_qt5获取电脑软件信息_不随。的博客-CSDN博客

计算机\HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall

void getSoftware()
{QString regStr = "HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\";QSettings settings(regStr, QSettings::NativeFormat);QStringList regGroups = settings.childGroups();foreach(QString regItem, regGroups){settings.beginGroup(regItem);QString displayName = settings.value("DisplayName").toString();QString uninstallString = settings.value("UninstallString").toString();if (!displayName.isEmpty()){qDebug() << "[" << __FUNCTION__ << __LINE__ << "] :" << displayName << uninstallString;}settings.endGroup();}
}
[ getSoftware 47 ] : "Visual Studio Community 2017" "\"C:\\Program Files (x86)\\Microsoft Visual Studio\\Installer\\setup.exe\" uninstall --installPath \"E:\\VS2017\\VisualStudio\""
[ getSoftware 47 ] : "Adobe Flash Player 34 ActiveX" "C:\\WINDOWS\\SysWOW64\\Macromed\\Flash\\FlashUtil32_34_0_0_289_ActiveX.exe -maintain activex"

(3 封私信 / 25 条消息) 电脑中的注册表是什么? - 知乎 (zhihu.com)

注册表由键,子键,值项构成。

一个键就是分支中的一个文件夹

而子键就是这个文件夹当中的子文件夹

子键同样是一个键。

一个值项则是一个键的当前定义

名称,数据类型,分配的值组成。

一个键可以有一个或多个值

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/143347.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

Java中的IO流的缓冲流

不爱生姜不吃醋⭐️ 如果本文有什么错误的话欢迎在评论区中指正 与其明天开始&#xff0c;不如现在行动&#xff01; 文章目录 &#x1f334;IO流体系结构&#x1f334;缓冲流1.提高效率的原理2.缓冲流的类型3.字符缓冲流两个特有方法 &#x1f334;总结 &#x1f334;IO流体系…

硬件系统工程师宝典(42)-----耦合电容如何布局?

各位同学大家好&#xff0c;欢迎继续做客电子工程学习圈&#xff0c;今天我们继续来讲这本书&#xff0c;硬件系统工程师宝典。 上篇我们说到了对时序有要求的系统中如何正确使用蛇形走线&#xff0c;可以增加信号的延时&#xff0c;符合系统的时序要求。今天来说说电容去耦的…

三、VXLAN静态方式实验举例

VXLAN静态方式实验举例 1.1、静态方式部署集中式网关1.1.1、VXLAN隧道建立1.1.2、MAC地址动态学习1.1.3、同子网已知单播报文转发1.1.4、同子网BUM报文转发1.1.5、跨子网报文转发1.1.6、配置VXLAN接入业务部署方式 1.2、配置举例&#xff0c;相同网段互通&#xff08;静态方式&…

(数组/字符串) 380. O(1) 时间插入、删除和获取随机元素 ——【Leetcode每日一题】

❓ 380. O(1) 时间插入、删除和获取随机元素 难度&#xff1a;中等 实现 RandomizedSet 类&#xff1a; RandomizedSet() 初始化 RandomizedSet 对象bool insert(int val) 当元素 val 不存在时&#xff0c;向集合中插入该项&#xff0c;并返回 true &#xff1b;否则&#x…

【Maven入门篇】(1)详细讲解Maven的安装报错解决

&#x1f38a;专栏【Maven入门篇】 &#x1f354;喜欢的诗句&#xff1a;更喜岷山千里雪 三军过后尽开颜。 &#x1f386;音乐分享【The truth that you leave】 &#x1f970;欢迎并且感谢大家指出我的问题 文章目录 &#x1f33a;Maven介绍⭐作用⭐官网 &#x1f384;maven安…

【C语言】文件操作(一)

前言 本篇博客讲解对文件的操作&#xff0c;包括打开&#xff0c;关闭操作。在下篇博客将讲解文件的读写。 文章目录 一、 什么是文件&#xff1f;1.1 用于存储数据1.2 文件类型1.3 文件名1.4 二进制文件和文本文件 二、文件的打开和关闭2.1 流和标准流2.2 文件指针2.3文件的打…

asp.net core automapper的使用

1.安装automapper的nuget包 AutoMapper.Extensions.Microsoft.DependencyInjection 2.创建需要映射的类和转换后的类 public class studto{public int sn { get; set; }public string name { get; set; }public string sex { get; set; }public int age { get; set; }public s…

前端的多种克隆方式和注意事项

克隆的意义和常见场景: 意义: 保证原数据的完整性和独立性常见场景: 复制数据, 函数入参, class构造函数等 浅克隆: 对象常用的浅克隆 es6扩展运算符...Object.assign 数组常用的浅克隆 es6的扩展运算符...slice>arr.slice(0)[].concat 深度克隆: 克隆对象的每个层级如…

如何套用模板制作大屏?

在山海鲸可视化的资源中心里内置了大量的二维、三维大屏模板&#xff0c;大家可以根据需要找到自己想要的模板&#xff0c;然后点击下载直接进行使用。 有需要可自行前往哔哩哔哩账号中观看相关内容的视频教程↓↓↓ 山海鲸可视化的个人空间-山海鲸可视化个人主页-哔哩哔哩视频…

NodeMCU ESP8266基于Arduino IDE的开发环境搭建(图文并茂)

文章目录 NodeMCU ESP8266基于Arduino IDE的开发环境搭建&#xff08;手把手教程&#xff09;软件下载官网地址百度云 安装IDE配置基础配置设置开发板 测试串口驱动下载测试用例 总结 NodeMCU ESP8266基于Arduino IDE的开发环境搭建&#xff08;手把手教程&#xff09; 软件下…

安卓备份基带分区 备份字库 步骤解析 以免误檫除分区或者“格机” 后悔莫及

玩机搞机---安卓机型mtk和高通芯片查看分区 导出分区 备份分区的一些工具分析 修复基带 改串码 基带qcn 改相关参数 格机危害 手机基带的重要性前面几期博文我都有相关的说明。他区别于别的分区。而且目前手机的安全性越来越高。基带分区基本都是专机专用。而不像早期机型一…

jvm深入研究文档--jvm分区以及职责

Java虚拟机&#xff08;JVM&#xff09;主要包括以下几个区域&#xff1a; 方法区&#xff08;Method Area&#xff09;&#xff1a;这个区域存储已被加载的类信息&#xff0c;常量&#xff0c;静态变量&#xff0c;即时编译器编译后的代码等数据。方法区是所有线程共享的。在…

uniapp:不同权限设置不同的tabBar

1、在pages.json里&#xff0c;将所有tabBar涉及的页面都加进来。 我这里使用username来动态显示tabBar。 jeecg用户显示&#xff1a;首页&#xff0c;订单&#xff0c;消息&#xff0c;发现&#xff0c;我的&#xff0c;一共5个tabBar。 admin用户显示&#xff1a;首页&…

如何修复wmvcore.dll缺失问题,wmvcore.dll下载修复方法分享

近年来&#xff0c;电脑使用的普及率越来越高&#xff0c;人们在日常生活中离不开电脑。然而&#xff0c;有时候我们可能会遇到一些问题&#xff0c;其中之一就是wmvcore.dll缺失的问题。wmvcore.dll是Windows平台上用于支持Windows Media Player的动态链接库文件&#xff0c;如…

Java内存泄漏知识(软引用、弱引用等)

关于作者&#xff1a;CSDN内容合伙人、技术专家&#xff0c; 从零开始做日活千万级APP。 专注于分享各领域原创系列文章 &#xff0c;擅长java后端、移动开发、商业变现、人工智能等&#xff0c;希望大家多多支持。 未经允许不得转载 目录 一、导读二、概览三、相关知识3.1 内存…

Java项目-Spring Boot的生鲜网上交易系统

博主介绍&#xff1a;✌程序员徐师兄、7年大厂程序员经历。全网粉丝30W、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 文章目录 1 简介2 技术栈3 系统功能4 功能设计5系统详细设计5.1系统功能模块5.2后台功能模块5\.2\.1用户功…

MongoDB基础详解

一、MongoDB概述 MongoDB 是一个基于 分布式文件存储 的开源 NoSQL 数据库系统&#xff0c;由 C 编写的。MongoDB 提供了 面向文档 的存储方式&#xff0c;操作起来比较简单和容易&#xff0c;支持“无模式”的数据建模&#xff0c;可以存储比较复杂的数据类型&#xff0c;是一…

C. Card Game

题目&#xff1a;样例&#xff1a; 输入 4 4 -4 1 -3 5 4 1 -2 3 -4 3 -1 3 -5 1 -1输出 5 4 2 0 思路&#xff1a; 这里的题意就是&#xff0c; 当我们 i 取奇数的时候&#xff0c;可以获得该奇数 i 的值&#xff0c;并去掉当前卡牌。 当我们 i 取偶数的时候&#xff0c;去掉当…

Java基础简单整理

文章目录 Java语言具有以下特点&#xff1a;Java SE vs Java EEJVM vs JDK vs JRE为什么说 Java 语言编译与解释并存&#xff1f;Java 和 C 的区别?Java注释用法&#xff1a;Java标识符Java基本数据类型链接Java字符串类型链接基本类型和包装类型的区别&#xff1f;静态方法为…

云计算与大数据——Storm配置及运行WordCountTopology(保姆级教程!)

云计算与大数据——Storm配置及运行WordCountTopology&#xff08;保姆级教程&#xff01;&#xff09; 前言 当今世界正处于云计算和大数据的快速发展阶段&#xff0c;而Storm作为一种高效、可靠的实时计算框架&#xff0c;受到了广泛的关注和应用。在这篇文章中&#xff0c…