墨水屏顯示模擬器程序解讀

程序如下:出處https://github.com/tsl0922/EPD-nRF5?tab=readme-ov-file

// GUI emulator for Windows
// This code is a simple Windows GUI application that emulates the display of an e-paper device.
#include <windows.h>
#include <stdint.h>
#include <time.h>
#include "GUI.h"#define BITMAP_WIDTH   400
#define BITMAP_HEIGHT  300
#define WINDOW_WIDTH   400
#define WINDOW_HEIGHT  340
#define WINDOW_TITLE   TEXT("Emurator")// Global variables
HINSTANCE g_hInstance;
HWND g_hwnd;
display_mode_t g_display_mode = MODE_CALENDAR; // Default to calendar mode
BOOL g_bwr_mode = TRUE;  // Default to BWR mode
time_t g_display_time;
struct tm g_tm_time;// Convert bitmap data from e-paper format to Windows DIB format
static uint8_t *convertBitmap(uint8_t *bitmap, uint16_t x, uint16_t y, uint16_t w, uint16_t h) {int bytesPerRow = ((w + 31) / 32) * 4; // Round up to nearest 4 bytesint totalSize = bytesPerRow * h;// Allocate memory for converted bitmapuint8_t *convertedBitmap = (uint8_t*)malloc(totalSize);if (convertedBitmap == NULL) return NULL;memset(convertedBitmap, 0, totalSize);int ePaperBytesPerRow = (w + 7) / 8; // E-paper buffer stridefor (int row = 0; row < h; row++) {for (int col = 0; col < w; col++) {// Calculate byte and bit position in e-paper bufferint bytePos = row * ePaperBytesPerRow + col / 8;int bitPos = 7 - (col % 8); // MSB first (typical e-paper format)// Check if the bit is set in the e-paper bufferint isSet = (bitmap[bytePos] >> bitPos) & 0x01;// Calculate byte and bit position in Windows DIBint dibBytePos = row * bytesPerRow + col / 8;int dibBitPos = 7 - (col % 8); // MSB first for DIB too// Set the bit in the Windows DIB if it's set in the e-paper bufferif (isSet) {convertedBitmap[dibBytePos] |= (1 << dibBitPos);}}}return convertedBitmap;
}// Implementation of the buffer_callback function
void DrawBitmap(uint8_t *black, uint8_t *color, uint16_t x, uint16_t y, uint16_t w, uint16_t h) {HDC hdc;RECT clientRect;int scale = 1;// Get the device context for immediate drawinghdc = GetDC(g_hwnd);if (!hdc) return;// Get client area for positioningGetClientRect(g_hwnd, &clientRect);// Calculate position to center the entire bitmap in the windowint drawX = (clientRect.right - BITMAP_WIDTH * scale) / 2;int drawY = (clientRect.bottom - BITMAP_HEIGHT * scale) / 2;// Create DIB for visible pixelsBITMAPINFO bmi;ZeroMemory(&bmi, sizeof(BITMAPINFO));bmi.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);bmi.bmiHeader.biWidth = w;bmi.bmiHeader.biHeight = -h; // Negative for top-down bitmapbmi.bmiHeader.biPlanes = 1;bmi.bmiHeader.biBitCount = 1;bmi.bmiHeader.biCompression = BI_RGB;uint8_t *convertedBitmap = convertBitmap(black, x, y, w, h);if (convertedBitmap == NULL) {ReleaseDC(g_hwnd, hdc);return;}// Set colors for black and white displaybmi.bmiColors[0].rgbBlue = 0;bmi.bmiColors[0].rgbGreen = 0;bmi.bmiColors[0].rgbRed = 0;bmi.bmiColors[0].rgbReserved = 0;bmi.bmiColors[1].rgbBlue = 255;bmi.bmiColors[1].rgbGreen = 255;bmi.bmiColors[1].rgbRed = 255;bmi.bmiColors[1].rgbReserved = 0;// Draw the black layerStretchDIBits(hdc,drawX + x * scale, drawY + y * scale,  // Destination positionw * scale, h * scale,                  // Destination size0, 0,                                 // Source positionw, h,                                 // Source sizeconvertedBitmap,                      // Converted bitmap bits&bmi,                                 // Bitmap infoDIB_RGB_COLORS,                       // UsageSRCCOPY);                             // Raster operation codefree(convertedBitmap);// Handle color layer if present (red in BWR displays)if (color) {// Allocate memory for converted color bitmapuint8_t *convertedColor = convertBitmap(color, x, y, w, h);if (convertedColor) {// Set colors for red overlaybmi.bmiColors[0].rgbBlue = 255;bmi.bmiColors[0].rgbGreen = 255;bmi.bmiColors[0].rgbRed = 0;bmi.bmiColors[0].rgbReserved = 0;bmi.bmiColors[1].rgbBlue = 0;bmi.bmiColors[1].rgbGreen = 0;bmi.bmiColors[1].rgbRed = 0;bmi.bmiColors[1].rgbReserved = 0;// Draw red overlayStretchDIBits(hdc,drawX + x * scale, drawY + y * scale,  // Destination positionw * scale, h * scale,                  // Destination size0, 0,                                 // Source positionw, h,                                 // Source sizeconvertedColor,                       // Converted bitmap bits&bmi,                                 // Bitmap infoDIB_RGB_COLORS,                       // UsageSRCINVERT);                           // Use XOR operation to blendfree(convertedColor);}}// Release the device contextReleaseDC(g_hwnd, hdc);
}// Window procedure
LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) {switch (message) {case WM_CREATE:// Initialize the display timeg_display_time = time(NULL) + 8*3600;// Set a timer to update the CLOCK periodically (every second)SetTimer(hwnd, 1, 1000, NULL);return 0;case WM_TIMER:if (g_display_mode == MODE_CLOCK) {g_display_time = time(NULL) + 8*3600;if (g_display_time % 60 == 0) {InvalidateRect(hwnd, NULL, FALSE);}}return 0;case WM_PAINT: {PAINTSTRUCT ps;HDC hdc = BeginPaint(hwnd, &ps);// Get client rect for calculationsRECT clientRect;GetClientRect(hwnd, &clientRect);// Clear the entire client area with a solid colorHBRUSH bgBrush = CreateSolidBrush(RGB(240, 240, 240));FillRect(hdc, &clientRect, bgBrush);DeleteObject(bgBrush);// Use the stored timestampgui_data_t data = {.bwr             = g_bwr_mode,.width           = BITMAP_WIDTH,.height          = BITMAP_HEIGHT,.timestamp       = g_display_time,.temperature     = 25,.voltage         = 3.2f,};// Call DrawGUI to render the interface, passing the BWR modeDrawGUI(&data, DrawBitmap, g_display_mode);EndPaint(hwnd, &ps);return 0;}case WM_KEYDOWN:// Toggle display mode with spacebarif (wParam == VK_SPACE) {if (g_display_mode == MODE_CLOCK)g_display_mode = MODE_CALENDAR;elseg_display_mode = MODE_CLOCK;InvalidateRect(hwnd, NULL, TRUE);}// Toggle BWR mode with R keyelse if (wParam == 'R') {g_bwr_mode = !g_bwr_mode;InvalidateRect(hwnd, NULL, TRUE);}// Handle arrow keys for month/day adjustmentelse if (wParam == VK_UP || wParam == VK_DOWN || wParam == VK_LEFT || wParam == VK_RIGHT) {// Get the current time structureg_tm_time = *localtime(&g_display_time);// Up/Down adjusts monthif (wParam == VK_UP) {g_tm_time.tm_mon++;if (g_tm_time.tm_mon > 11) {g_tm_time.tm_mon = 0;g_tm_time.tm_year++;}}else if (wParam == VK_DOWN) {g_tm_time.tm_mon--;if (g_tm_time.tm_mon < 0) {g_tm_time.tm_mon = 11;g_tm_time.tm_year--;}}// Left/Right adjusts dayelse if (wParam == VK_RIGHT) {g_tm_time.tm_mday++;}else if (wParam == VK_LEFT) {g_tm_time.tm_mday--;}// Convert back to time_tg_display_time = mktime(&g_tm_time);// Force redrawInvalidateRect(hwnd, NULL, TRUE);}return 0;case WM_DESTROY:KillTimer(hwnd, 1);PostQuitMessage(0);return 0;default:return DefWindowProc(hwnd, message, wParam, lParam);}
}// Main entry point
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) {g_hInstance = hInstance;// Register window classWNDCLASSA wc = {0}; // Using WNDCLASSA for ANSI versionwc.style = CS_HREDRAW | CS_VREDRAW;wc.lpfnWndProc = WndProc;wc.hInstance = hInstance;wc.hCursor = LoadCursor(NULL, IDC_ARROW);wc.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);wc.lpszClassName = "BitmapDemo"; // No L prefix - using ANSI stringsif (!RegisterClassA(&wc)) {MessageBoxA(NULL, "Window Registration Failed!", "Error", MB_ICONEXCLAMATION | MB_OK);return 0;}// Create the window - explicit use of CreateWindowA for ANSI versiong_hwnd = CreateWindowA("BitmapDemo","Emurator", // Using simple titleWS_OVERLAPPEDWINDOW,CW_USEDEFAULT, CW_USEDEFAULT,WINDOW_WIDTH, WINDOW_HEIGHT,NULL, NULL, hInstance, NULL);if (!g_hwnd) {MessageBoxA(NULL, "Window Creation Failed!", "Error", MB_ICONEXCLAMATION | MB_OK);return 0;}// Show windowShowWindow(g_hwnd, nCmdShow);UpdateWindow(g_hwnd);// Main message loopMSG msg;while (GetMessage(&msg, NULL, 0, 0)) {TranslateMessage(&msg);DispatchMessage(&msg);}return (int)msg.wParam;
}

代碼功能概述

這段 C 語言代碼是一個 Windows GUI 應用程序,用于模擬電子紙顯示設備的界面。它支持黑白和黑白紅 (BWR) 兩種顯示模式,并能在時鐘和日歷兩種顯示模式間切換。程序通過 Windows API 創建窗口,處理用戶輸入,并模擬電子紙的顯示效果。

主要模塊與功能分析


1. 全局變量與宏定義

#define BITMAP_WIDTH ? 400
#define BITMAP_HEIGHT ?300
#define WINDOW_WIDTH ? 400
#define WINDOW_HEIGHT ?340
#define WINDOW_TITLE ? TEXT("Emurator")

HINSTANCE g_hInstance;
HWND g_hwnd;
display_mode_t g_display_mode = MODE_CALENDAR;
BOOL g_bwr_mode = TRUE;
time_t g_display_time;
struct tm g_tm_time;


定義了顯示區域和窗口的尺寸

聲明了窗口句柄、顯示模式和時間相關變量

默認顯示模式為日歷,默認支持 BWR (黑白紅) 模式


2. 位圖轉換函數 convertBitmap

static uint8_t *convertBitmap(uint8_t *bitmap, uint16_t x, uint16_t y, uint16_t w, uint16_t h) {
? ? // 計算行字節數并分配內存
? ? int bytesPerRow = ((w + 31) / 32) * 4;
? ? int totalSize = bytesPerRow * h;
? ? uint8_t *convertedBitmap = (uint8_t*)malloc(totalSize);
? ? memset(convertedBitmap, 0, totalSize);
? ??
? ? // 轉換電子紙格式(MSB優先)到位圖格式
? ? int ePaperBytesPerRow = (w + 7) / 8;
? ? for (int row = 0; row < h; row++) {
? ? ? ? for (int col = 0; col < w; col++) {
? ? ? ? ? ? // 計算電子紙緩沖區中的位位置
? ? ? ? ? ? int bytePos = row * ePaperBytesPerRow + col / 8;
? ? ? ? ? ? int bitPos = 7 - (col % 8);
? ? ? ? ? ? int isSet = (bitmap[bytePos] >> bitPos) & 0x01;
? ? ? ? ? ??
? ? ? ? ? ? // 設置Windows DIB中的對應位
? ? ? ? ? ? int dibBytePos = row * bytesPerRow + col / 8;
? ? ? ? ? ? int dibBitPos = 7 - (col % 8);
? ? ? ? ? ? if (isSet) {
? ? ? ? ? ? ? ? convertedBitmap[dibBytePos] |= (1 << dibBitPos);
? ? ? ? ? ? }
? ? ? ? }
? ? }
? ? return convertedBitmap;
}

將電子紙設備使用的位圖格式轉換為 Windows DIB (設備無關位圖) 格式

處理了位序轉換 (MSB 優先) 和行字節對齊問題

支持黑白和彩色 (紅色) 兩層顯示

DrawBitmap 函數詳解

該函數是電子紙模擬器的核心繪制函數,負責將電子紙的位圖數據(黑白層和彩色層)轉換為 Windows 窗口可顯示的位圖,并完成最終渲染。

以下從功能流程、關鍵技術點和代碼細節三方面展開分析:

一、函數功能與流程總覽

輸入參數:

? black:黑白層位圖數據(1 位單色,MSB 優先)

? color:彩色層位圖數據(可選,通常用于紅色顯示)

? x/y:繪制起點坐標(相對于顯示區域)

? w/h:繪制區域的寬度和高度

?核心流程:

1. 獲取繪圖環境:獲取窗口的設備上下文(HDC)和客戶區尺寸。

2. 配置位圖信息:定義 Windows 位圖格式(BITMAPINFO),包括尺寸、位深、顏色表等。

3. 繪制黑白層: ? 調用 convertBitmap 轉換電子紙格式為 Windows 位圖。 ? 使用 StretchDIBits 繪制黑色前景和白色背景。 ?

4. 繪制彩色層(可選): ? 轉換彩色層數據并設置顏色表(紅色通過黃色與黑色異或實現)。 ? 使用 SRCINVERT 光柵操作混合顏色層。 ?

5. 釋放資源:歸還設備上下文,避免內存泄漏。 ?

二、關鍵技術點解析

1. 設備上下文(HDC)與窗口坐標系

? GetDC(g_hwnd):獲取窗口的設備上下文,用于直接在窗口上繪制圖形。

? GetClientRect:獲取窗口客戶區(不含邊框和標題欄)的尺寸,

用于計算位圖居中顯示的位置:

?int drawX = (clientRect.right - BITMAP_WIDTH * scale) / 2;
int drawY = (clientRect.bottom - BITMAP_HEIGHT * scale) / 2;
? ? ?
(代碼中雖未顯式計算 scale,但通過 StretchDIBits 的縮放參數實現自適應顯示)

?2. 位圖信息頭(BITMAPINFO)配置

? BITMAPINFO bmi = {0};
bmi.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
bmi.bmiHeader.biWidth = w; ? ? ? ? ? ? ?// 位圖寬度(像素)
bmi.bmiHeader.biHeight = -h; ? ? ? ? ? ?// 負高度表示位圖數據從上到下存儲(正向顯示)
bmi.bmiHeader.biPlanes = 1; ? ? ? ? ? ? // 平面數,固定為1
bmi.bmiHeader.biBitCount = 1; ? ? ? ? ? // 1位單色位圖(每個像素占1位,0=黑色,1=白色)
bmi.bmiHeader.biCompression = BI_RGB; ? // 無壓縮,使用RGB顏色表
? ? ?? 負高度的作用:

Windows 位圖有兩種存儲方式:

? 正高度:位圖數據從下到上存儲(原點在左下角)。

? 負高度:位圖數據從上到下存儲(原點在左上角),更符合常規坐標系,便于直接繪制。 ?

?3. 位圖格式轉換(convertBitmap)

? 電子紙格式特點:

? 1 位單色,MSB 優先(最高位為第一個像素)。

? 行字節數為 (寬度 + 7) / 8(向上取整到字節)。 ?

? Windows DIB 格式要求: ? 1 位位圖使用 BI_RGB 壓縮,行字節數需為 4 的倍數(通過 ((w + 31) / 32) * 4 計算)。 ? ? 轉換邏輯: c ? ? ? ?// 電子紙緩沖區中的位位置(MSB優先)
int bitPos = 7 - (col % 8); ?
// Windows DIB 中的位位置(同樣MSB優先)
int dibBitPos = 7 - (col % 8); ?
? ? ?
通過逐行逐位復制,將電子紙的 “位掩碼” 轉換為 Windows 可識別的位圖數據。 ?4. 顏色表與繪制邏輯 ? 黑白層繪制: c ? ? ? ?bmi.bmiColors[0] = RGB(0, 0, 0); // 索引0對應黑色(位圖中值為0的像素)
bmi.bmiColors[1] = RGB(255, 255, 255); // 索引1對應白色(位圖中值為1的像素)
StretchDIBits(..., SRCCOPY); // 直接復制像素,黑色前景覆蓋白色背景
? ? ?
?? 彩色層(紅色)繪制:

? 電子紙彩色層通常為紅色,但 Windows 位圖不支持直接繪制紅色單通道,因此通過 異或(XOR)操作 模擬:

bmi.bmiColors[0] = RGB(255, 255, 0); // 黃色(R=255, G=255, B=0)
bmi.bmiColors[1] = RGB(0, 0, 0); // 黑色(背景)
StretchDIBits(..., SRCINVERT); // 異或操作:黃色 ^ 白色 = 紅色,黃色 ^ 黑色 = 黃色
? ? ?
?? 異或原理:

? 白色背景區域(RGB (255,255,255)):黃色(RGB (255,255,0))與白色異或后為紅色(RGB (255,0,0))。

? 黑色前景區域(RGB (0,0,0)):黃色與黑色異或后保持黃色,但因黑色層已覆蓋,實際不顯示。 ? ? ?三、代碼細節與注意事項

1. 內存管理

? 動態分配與釋放:

uint8_t *convertedBitmap = convertBitmap(...); // 分配內存
// 使用后立即釋放
free(convertedBitmap);?
避免因忘記釋放內存導致程序泄漏。 ?

2. 光柵操作碼(Raster Operation)

? SRCCOPY:直接復制源位圖到目標區域,覆蓋原有像素(用于黑白層)。

? SRCINVERT:源位圖與目標區域像素異或(用于彩色層疊加)。

?3. 電子紙特性模擬

? 分層繪制:電子紙通常支持黑白層和彩色層獨立更新,此處通過兩次 StretchDIBits 調用模擬分層。

? 低刷新率:電子紙實際刷新較慢,但代碼中未模擬延遲,僅通過定時器控制界面更新頻率。 ?四、總結 DrawBitmap 函數通過以下步驟實現電子紙顯示模擬:

1. 格式適配:將電子紙的位掩碼格式轉換為 Windows 位圖,處理位序和行對齊問題。

2. 分層渲染:先繪制黑白層作為基礎,再通過異或操作疊加彩色層(紅色)。

3. 資源管理:及時釋放內存和設備上下文,確保程序穩定性。 ?該函數是電子紙模擬器的核心渲染引擎,結合窗口消息處理和用戶輸入,最終實現了可交互的電子紙界面效果。


??

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/83613.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/83613.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/83613.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【技海登峰】Kafka漫談系列(十一)SpringBoot整合Kafka之消費者Consumer

【技海登峰】Kafka漫談系列(十一)SpringBoot整合Kafka之消費者Consumer spring-kafka官方文檔: https://docs.spring.io/spring-kafka/docs/2.8.10/reference/pdf/spring-kafka-reference.pdf KafkaTemplate API: https://docs.spring.io/spring-kafka/api/org/springframe…

【言語理解】邏輯填空之邏輯對應11

front&#xff1a;詞義辨析 11.1前后解釋對應 填空的詞匯大意可能是吖要結合實際情況不要一味高估導致適得其反的結果 未雨綢繆&#xff1a;趁著天沒下雨&#xff0c;先修繕房屋門窗。比喻事先做好準備工作&#xff0c;預防意外的事發生。&#xff08;提前做好準備&#xff0c…

ubuntu上 opencv + eclipse + C++

ubuntu上 opencv eclipse C 1. 安裝eclipse 安裝eclipse不用說了&#xff0c;前置條件要安裝java 配置快捷鍵方式 2. 新建c項目 配置opencv環境 project -> properties: 配置c標準庫版本&#xff1a; 配置opencv頭文件&#xff1a; 配置opencv庫文件&#xff1a;…

動態內存管理2+柔性數組

一、動態內存經典筆試題分析 分析錯誤并改正 題目1 void GetMemory(char *p) {p (char *)malloc(100); } void Test(void) {char *str NULL;GetMemory(str);strcpy(str, "hello world");printf(str); } int main() {Test();return 0; }錯誤的原因&#xff1a; …

AI寫PPT可以用嗎?我測試了3款AI寫PPT工具,分享感受

上周五臨下班&#xff0c;領導突然讓我周末趕出一份季度營銷報告 PPT&#xff0c;還要求周一晨會展示。看著空蕩蕩的 PPT 頁面&#xff0c;我滿心都是絕望 —— 周末不僅泡湯&#xff0c;搞不好還得熬夜到凌晨。好在同部門的前輩給我推薦了幾款 AI 寫 PPT 工具&#xff0c;沒想…

PrimeVul論文解讀-如何構建高質量漏洞標簽與數據集

目錄 1. 引入2. 現有漏洞識別方案的不足2.1 數據集中label不準2.2 數據重復2.3 測評標準不夠好 3. 現有漏洞識別數據集分析3.1 關于現有數據集中label的準確率分析3.2 關于現有數據集中數據泄露&#xff08; Data Leakage&#xff09;情況分析 4. 漏洞識別測評5. PrimeVul數據集…

關于數據湖和數據倉的一些概念

一、前言 隨著各行業數字化發展的深化,數據資產和數據價值已越來越被深入企業重要發展的戰略重心,海量數據已成為多數企業生產實際面臨的重要問題,無論存儲容量還是成本,可靠性都成為考驗企業數據治理的考驗。本文來看下海量數據存儲的數據湖和數據倉,數據倉庫和數據湖,…

linux-----------------庫制作與原理(下)

1.ELF文件 要理解編譯鏈鏈接的細節&#xff0c;我們不得不了解?下ELF?件。其實有以下四種?件其實都是ELF?件&#xff1a; ? 可重定位?件&#xff08;Relocatable File &#xff09; &#xff1a;即 xxx.o ?件。包含適合于與其他?標?件鏈接來創 建可執??件或者共享…

python-爬蟲基礎

爬蟲本質&#xff1a;通過編寫程序來獲取到互聯網上的資源。 我們的程序本質上就是模擬瀏覽器 一個簡單的小爬蟲&#xff1a; 只需要三步&#xff1a; from urllib.request import urlopen #url是網址&#xff0c;request意思是請求 這里跑出來的中文是這樣的注意看&#…

單元化架構

目錄 ????????編輯 單元化 邏輯單元 單元化 多地多機房部署&#xff0c;是互聯網系統的必然發展方向&#xff0c;一個系統要走到這一步&#xff0c;也就必然要解決上面提到的問題&#xff1a;流量調配、數據拆分、延時等。業界有很多技術方案可以用來解決這些問題&…

【免殺】C2免殺技術(五)動態API

一、什么是動態API 在C2免殺領域中&#xff0c;“動態API” 主要指的是繞過靜態檢測的一種技術手段&#xff0c;其本質是運行時動態解析和調用Windows API函數&#xff0c;而不是在程序編譯階段就明確引用這些API。這種方式可以有效躲避靜態分析工具和殺軟的簽名識別。 為什么…

Python爬蟲實戰:研究JavaScript壓縮方法實現逆向解密

一、引言 在數字化信息爆炸的時代,網絡數據已成為驅動各行業發展的核心資產。Python 憑借其豐富的庫生態和簡潔的語法,成為網絡爬蟲開發的首選語言。然而,隨著互聯網安全防護機制的不斷升級,網站普遍采用 JavaScript 壓縮與混淆技術保護其核心邏輯和數據傳輸,這使得傳統爬…

HTTP 請求走私(HTTP Request Smuggling)

HTTP 請求走私&#xff08;HTTP Request Smuggling&#xff09;是一種通過利用前端代理&#xff08;如負載均衡器、CDN&#xff09;和后端服務器在 解析 HTTP 請求時存在不一致性 的漏洞&#xff0c;從而實現 注入惡意請求 的攻擊技術。 一、基本原理 HTTP 請求走私主要依賴兩…

【Google機器學習實踐指南(線性回歸篇)

&#x1f50d; Google機器學習實踐指南&#xff08;線性回歸篇&#xff09; Google機器學習實戰(3)-單變量線性回歸核心解析&#xff0c;掌握房價預測模型 一、建模流程全景圖 ▲ 四大核心步驟&#xff1a; 數據可視化→特征工程→模型訓練→預測推理 二、房價預測實戰 1. …

python打卡day16

NumPy 數組基礎 因為前天說了shap&#xff0c;這里涉及到數據形狀尺寸問題&#xff0c;所以需要在這一節說清楚&#xff0c;后續的神經網絡我們將要和他天天打交道。 知識點&#xff1a; numpy數組的創建&#xff1a;簡單創建、隨機創建、遍歷、運算numpy數組的索引&#xff1a…

ubuntu 20.04 更改國內鏡像源-阿里源 確保可用

鏡像源是跟linux版本一一對應的,查詢自己系統的版本號&#xff1a; 命令&#xff1a;lsb_release -a macw:~$ lsb_release -a No LSB modules are available. Distributor ID: Ubuntu Description: Ubuntu 20.04.6 LTS Release: 20.04 Codename: focal macw:~$…

基于OpenCV的SIFT特征和FLANN匹配器的指紋認證

文章目錄 引言一、概述二、代碼解析1. 圖像顯示函數2. 核心認證函數2.1 創建SIFT特征提取器2.2 檢測關鍵點和計算描述符&#xff08;源圖像&#xff09;2.3 檢測關鍵點和計算描述符&#xff08;模板圖像&#xff09;2.4 創建FLANN匹配器2.5 使用K近鄰匹配 3. 匹配點篩選4. 認證…

四品種交易策略

策略概述 策略思路: 交易品種:同時交易四個品種,每個品種使用總資金的10%。 合約選擇:使用連續合約(data0)發出交易信號,實際交易 主力合約(data1)和下一個主力合約(data2)。 資金管理:總資金用A_CurrentEquity表示,交易手數據此計算。 止損執行:盤中達到止損…

MySQL事務的一些奇奇怪怪知識

Gorm事務有error卻不返回會發生什么 Gorm包是大家比較高頻使用。正常的用法是&#xff0c;如果有失敗返回error&#xff0c;整體rollback&#xff0c;如果不返回error則commit。下面是Transaction的源碼&#xff1a; // Transaction start a transaction as a block, return …

時序數據庫、實時數據庫與實時數倉:如何為實時數據場景選擇最佳解決方案?

隨著物聯網、金融交易、在線游戲等場景對實時數據處理需求的增長&#xff0c;市場上涌現出多種專門針對實時數據處理的數據庫解決方案。然而&#xff0c;面對時序數據庫、實時數據庫和實時數據倉庫這三種看似相似的技術&#xff0c;許多技術決策者常常感到困惑&#xff1a;它們…