B450-ITX

B450-ITX
B450-ITX
B450-ITX
B450-ITX
B450-ITX
B450-ITX
B450-ITX
B450-ITX

買雜牌『B450-ITX』配『RYZEN5-1500X』砌臺ITX,摆係老竇屋企睇片.

點知『BE200』WIFI吾認識.篮牙要更新BIOS.

SSD磁盤冇法指盤符,要装最新版Windows10-22H2.

 

Intel Wi-Fi 7 BE200

Intel Wi-Fi 7 BE200
Intel Wi-Fi 7 BE200
Intel Wi-Fi 7 BE200
Intel Wi-Fi 7 BE200
Intel Wi-Fi 7 BE200
Intel Wi-Fi 7 BE200

之前係老竇屋企砌臺ITX電腦愛蒞睇片,『BE200』新出買蒞試試, 點知係係『b450-itx』可以認藍牙,唔認WIFI.反而係『x99-itx』藍牙WIFI都認.

唯有『AX210』配『b450-itx』, 『BE200』配『x99-itx』.

下載最新Intel WiFi驅動.

https://downloadmirror.intel.com/812774/WiFi-23.20.0-Driver64-Win10-Win11.exe
https://downloadmirror.intel.com/812775/WiFi-23.20.0-Driver64-Win10-Win11.zip
https://downloadmirror.intel.com/794069/BT-23.10.0-64UWD-Win10-Win11.exe
https://downloadmirror.intel.com/794708/BT-23.10.0-64UWD-Win10-Win11.zip

 

X99-EATX禁CPU-C3 Report /CPU-C6 Report

X99-EATX禁CPU-C3 Report /CPU-C6 Report
X99-EATX禁CPU-C3 Report /CPU-C6 Report

登入Win10間謁會TeeDriverW8x64.sys蓝屏, 聽聞禁節能模式可修复,『CPU C3 report』『CPU C6 report』.

  1. 著機logo,撳『del』鍵登入BIOS
  2. 撳『IntelRCSetup』
  3. 撳『CPU C3 Report』揀『Disabled』
  4. 撳『CPU C6 Report』揀『Disabled』

UTF8/BIG5/Shift-JIS/EUC-KR/GB2312判定

UTF8/BIG5/Shift-JIS/EUC-KR/GB2312判定
UTF8/BIG5/Shift-JIS/EUC-KR/GB2312判定

係電腦發展初時定義左套『ASCII碼』,得128字符,英文加數字用單字節BYTE. 後蒞各國皆自定『字符編碼』,『Shift-JIS/EUC-KR/BIG5/GB2312』皆占两字節WORD,结果係編碼重叠.所以先有亂碼.

Low 8bit Height 8bit
ASCII-128 0 ~ 0x7F N/A
BIG5漢字 0xA1 ~ 0xF9 0x40 ~ 0x7E

0xA1 ~ 0xFE

SHIFT-JIS日字 0x81~0x9f

0xe0~0xef

0x40~0x7e

0x80~0xfc

EUC-KR韓字 0xA1~0xFE 0xA1~0xFE
GB2312中字 0xA1 ~ 0xF7 0xA1 ~ 0xFE
GBK中字 0x81 ~ 0xFE 0x40 ~ 0xFE

『UTF-8』係Unicode『萬國碼』變體,首byte前缀標記字符長度.前缀0長度1, 前缀110長度2, 前缀1110長度3.以此类推.尾随byte前缀皆標記01.

『UTF-8』bin 長度
bin:0xxxxxxx 1
bin:110xxxxx 10xxxxxx 2
bin:1110xxxx 10xxxxxx 10xxxxxx 3
bin:11110xxx 10xxxxxx 10xxxxxx 10xxxxxx 4
bin:111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 5
bin:1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 6

UTF-8判定

if ((utf8[0] & 0x80) == 0x00)

return 1;

值小於0x80的ASCII字元
if ((utf8[0] & 0xE0) == 0xC0  &&

(utf8[1] & 0xC0) == 0x80)

return 2;

2字節UTF-8字符
if ((utf8[0] & 0xF0) == 0xE0 &&

(utf8[1] & 0xC0) == 0x80 &&

(utf8[2] & 0xC0) == 0x80)

return 3;

3字節UTF-8字符
if ((utf8[0] & 0xF8) == 0xF0 &&

(utf8[1] & 0xC0) == 0x80 &&

(utf8[2] & 0xC0) == 0x80 &&

(utf8[3] & 0xC0) == 0x80)

return 4;

4字節UTF-8字符
if ((utf8[0] & 0xFC) == 0xF8 &&

(utf8[1] & 0xC0) == 0x80 &&

(utf8[2] & 0xC0) == 0x80 &&

(utf8[3] & 0xC0) == 0x80 &&

(utf8[4] & 0xC0) == 0x80)

return 5;

5字節UTF-8字符
if ((utf8[0] & 0xFE) == 0xFC &&

(utf8[1] & 0xC0) == 0x80 &&

(utf8[2] & 0xC0) == 0x80 &&

(utf8[3] & 0xC0) == 0x80 &&

(utf8[4] & 0xC0) == 0x80 &&

(utf8[5] & 0xC0) == 0x80)

return 6;

6字节UTF-8字符

值小於0x80係ASCII字符集

if ((string[0] & 0x80) == 0x00)

return 1;

BIG5漢字符集編碼范圍

if ((string[0] >= 0xA1 && string[0] <= 0xF9) &&

(string[1] >= 0x40 && string[1] <= 0x7E ||

string[1] >= 0xA1 && string[1] <= 0xFE) )

return 2;

SHIFT-JIS日字符集編碼范圍

if ((string[0] >= 0x81 && string[0] <= 0xF9 ||

string[0] >= 0xe0 && string[0] <= 0xef) &&

(string[1] >= 0x40 && string[1] <= 0x7E ||

string[1] >= 0xA1 && string[1] <= 0xFE) )

return 2;

EUC-KR韓字符集編碼范圍

if ((string[0] >= 0xA1 && string[0] <= 0xFE) &&

(string[1] >= 0xA1 && string[1] <= 0xFE))

return 2;

GB2312中字符集編碼范圍

if ((string[0] >= 0xA1 && string[0] <= 0xF7) &&

(string[1] >= 0XA1 && string[1] <= 0XFE) )

return 2;

GBK中字符集編碼范圍

if ((string[0] >= 0x81 && string[0] <= 0xFE) &&

(string[1] >= 0XA0 && string[1] <= 0XFE) )

return 2;

 

UNICODE-UTF8轉換

UNICODE-UTF8轉換
UNICODE-UTF8轉換

係電腦發展初時.定義左套『ASCII碼』,得128字符,英文加數字用單字節BYTE. 後蒞各國皆自定『字符編碼』,『BIG5/GB2312』皆占两字節WORD,结果係編碼重叠.所以先有亂碼.

UNICODE『萬國碼』,各國各自有獨立編碼段,吾重叠,同『ASCII碼』兼容.

『UNICODE』係設計之初每字符占『2 BYTE』即『USC2』字符集. 但係『2 BYTE』够支持65535字符.所以後蒞有『USC4』占『4 BYTE』.

係同壹字符串USC2同USC4會混合出現.

但係『ASCII碼』只需單字節『1 BYTE』. 所以發明左『UTF-8』以節約地方.

『UTF-8』同『UNICODE』按照下表互為轉换.

Unicode『USC2』字符集HEX 『UTF-8』bin
0x0000~0x007F 0xxxxxxx
0x0080~0x07FF 110xxxxx 10xxxxxx
0x0800~0xFFFF 1110xxxx 10xxxxxx 10xxxxxx

為左係同壹字符串『USC2』同『USC4』混合出現.係『USC4』字符『低16bit』同『高16bit』分別加前缀標記.

『低16bit』加『0xD800』,『高16bit』加『0xDC00』,再加壹區域0x10000.

前缀標記『0xD800』『0xDC00』各占6bit,各净低10bit加埋有『20bit』.够支持 『1048576』字符

USC4-低16bit前缀標記 0xD800 BIN:110110 00000 00000
USC4-高16bit前缀標記 0xDC00 BIN:110111 00000 00000

 

USC4 前缀標記 USC4=前缀標記+字符
低16bit 0xD800 BIN:110110 00000 00000 + BIN:xxxxxxxxxx
高16bit 0xDC00 BIN:110111 00000 00000 + BIN:xxxxxxxxxx

utf8 轉 usc4

首字節 value = utf8[sour] & (0xFF >> (bytes + 1));

++sour;

尾随字節 for (int i = 1; i < bytes; ++i) {

value = value << 6;

value = value | (utf8[sour] & 0x3f);// 提低6bit

++sour;

}

减壹區域 value = value – 0x10000
低16bit unicode[dest] = 0xD800 | ((value >> 10) & 0x3ff );
高16bit unicode[dest+1] = 0xDC00 | ((value) & 0x3ff);

dest = dest + 2;

utf8 轉 usc2

首字節 value = utf8[sour] & (0xFF >> (bytes + 1));

++sour;

尾随字節 for (int i = 1; i < bytes; ++i) {

value = value << 6;

value = value | (utf8[sour] & 0x3f);

++sour;

}

反轉字節 v = (value >> 24) & 0xFF;

unicode[dest] = v;

v = (value >> 16) & 0xFF;

if (v != 0) {

unicode[dest] = (unicode[dest] << 8) + v;

++dest;

}

反轉字節 v = (value >> 8) & 0xFF;

unicode[dest] = v;

v = value & 0xFF;

if (v != 0) {

unicode[dest] = (unicode[dest] << 8) + v;

++dest;

}

Usc4轉utf8

提取字符 value = (unicode[sour] – 0xD800) << 10 | (unicode[sour + 1] – 0xDC00);
加壹區域 value = value + 0x10000;

Usc2轉utf8

提取字符 value = unicode[sour];
首字節 utf8[dest] = (0xFF << (8 – bytes)) | (value >> ((bytes – 1) * 6));

++dest;

尾随字節 for (int i = 1; i < bytes; ++i) {

utf8[dest] = 0x80 | (value >> ((bytes – i – 1) * 6) & 0x3F);

++dest;

}

++sour;

『UTF-8』首byte,前缀標記字符長度. 前缀0長度1, 前缀110長度2, 前缀1110長度3. 以此类推.尾随byte前缀皆標記01.

『UTF-8』bin 長度
bin:0xxxxxxx 1
bin:110xxxxx 10xxxxxx 2
bin:1110xxxx 10xxxxxx 10xxxxxx 3
bin:11110xxx 10xxxxxx 10xxxxxx 10xxxxxx 4
bin:111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 5
bin:1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 6

按首BIT符號,計算UTF8字符長度,返回0非UFT8字符.

『UTF-8』字符
if ((utf8[0] & 0x80) == 0x00)

return 1;

0xxxxxxx
if ((utf8[0] & 0xE0) == 0xC0  &&

(utf8[1] & 0xC0) == 0x80)

return 2;

110xxxxx 10xxxxxx
if ((utf8[0] & 0xF0) == 0xE0 &&

(utf8[1] & 0xC0) == 0x80 &&

(utf8[2] & 0xC0) == 0x80)

return 3;

1110xxxx

10xxxxxx

10xxxxxx

if ((utf8[0] & 0xF8) == 0xF0 &&

(utf8[1] & 0xC0) == 0x80 &&

(utf8[2] & 0xC0) == 0x80 &&

(utf8[3] & 0xC0) == 0x80)

return 4;

11110xxx

10xxxxxx

10xxxxxx

10xxxxxx

if ((utf8[0] & 0xFC) == 0xF8 &&

(utf8[1] & 0xC0) == 0x80 &&

(utf8[2] & 0xC0) == 0x80 &&

(utf8[3] & 0xC0) == 0x80 &&

(utf8[4] & 0xC0) == 0x80)

return 5;

111110xx

10xxxxxx

10xxxxxx

10xxxxxx

10xxxxxx

if ((utf8[0] & 0xFE) == 0xFC &&

(utf8[1] & 0xC0) == 0x80 &&

(utf8[2] & 0xC0) == 0x80 &&

(utf8[3] & 0xC0) == 0x80 &&

(utf8[4] & 0xC0) == 0x80 &&

(utf8[5] & 0xC0) == 0x80)

return 6;

1111110x

10xxxxxx

10xxxxxx

10xxxxxx

10xxxxxx

10xxxxxx

unicode轉utf8 , ASCII碼相等.

 int UnicodeToUTF8(char * utf8, const wchar_t * unicode)

{

int unicodeLength = 0;

int bytes;

int dest, sour;

DWORD value;

unicodeLength = Unicode_Length(unicode) ;

sour = dest = 0;

while (sour < unicodeLength)

{

bytes = 1;

if (unicode[sour] >= 0xD800 && unicode[sour + 1] >= 0xDC00)

bytes = 4;

else

if (unicode[sour] >= 0x00 && unicode[sour] <= 0x7F)

bytes = 1;

else

if (unicode[sour] >= 0x80 && unicode[sour] <= 0x7FF)

bytes = 2;

else

if (unicode[sour] >= 0x800 && unicode[sour] <= 0xFFFF)

bytes = 3;

else

if (((unicode[sour + 1] << 16) | unicode[sour]) >= 0x10000 &&

((unicode[sour + 1] << 16) | unicode[sour]) <= 0x1FFFFF)

bytes = 4;

else

if (((unicode[sour + 1] << 16) | unicode[sour]) >= 0x200000 &&

((unicode[sour + 1] << 16) | unicode[sour]) <= 0x3FFFFFF)

bytes = 5;

else

if (((unicode[sour + 1] << 16) | unicode[sour]) >= 0x4000000 &&

((unicode[sour + 1] << 16) | unicode[sour]) <= 0x7FFFFFFF)

bytes = 6;

else

if (((unicode[sour + 1] << 16) | unicode[sour]) >= 0x80000000)

bytes = 7;

 

if (bytes == 1)

{

utf8[dest] = unicode[sour];

++dest;

++sour;

}

else

if (unicode[sour] >= 0xD800 && unicode[sour + 1] >= 0xDC00)

{

value = (unicode[sour] – 0xD800) << 10   |  (unicode[sour + 1] – 0xDC00);

value = value + 0x10000;

utf8[dest] = (0xFF << (8 – bytes)) | (value >> ((bytes – 1) * 6));

++dest;

for (int i = 1; i < bytes; ++i) {

utf8[dest] = 0x80 | (value >> ((bytes – i – 1) * 6) & 0x3F);

++dest;

}

sour = sour + 2;

}

else

if (bytes == 2 || bytes == 3)

{

value = unicode[sour];

utf8[dest] = (0xFF << (8 – bytes)) | (value >> ((bytes – 1) * 6));

++dest;

for (int i = 1; i < bytes; ++i) {

utf8[dest] = 0x80 | (value >> ((bytes – i – 1) * 6) & 0x3F);

++dest;

}

++sour;

}

else

if (bytes >= 4)

{

value = (unicode[sour + 1] << 16) | unicode[sour];

utf8[dest] = (0xFF << (8 – bytes)) | (value >> ((bytes – 1) * 6));

++dest;

for (int i = 1; i < bytes; ++i) {

utf8[dest] = 0x80 | (value >> ((bytes – i – 1) * 6) & 0x3F);

++dest;

}

sour = sour + 2;

}

}

utf8[dest] = NULL;

return dest;

}

utf8 轉 unicode

 int UTF8ToUnicode(wchar_t * unicode, const char* utf8)

{

int utf8Length;

int sour, dest;

int bytes;

dest = sour = 0;

DWORD value;

BYTE v;

utf8Length = strlen(utf8);

while (sour < utf8Length)

{

if ((utf8[sour] & 0x80) == 0x00)

bytes = 1;

else

if ((utf8[sour] & 0xE0) == 0xC0)

bytes = 2;

else

if ((utf8[sour] & 0xF0) == 0xE0)

bytes = 3;

else

if ((utf8[sour] & 0xF8) == 0xF0)

bytes = 4;

else

if ((utf8[sour] & 0xFC) == 0xF8)

bytes = 5;

else

if ((utf8[sour] & 0xFE) == 0xFC)

bytes = 6;

else

bytes = 7;

if (bytes == 1)

{

unicode[dest] = utf8[sour];

++dest;

++sour;

}

else

if (bytes == 2 || bytes == 3)

{

value = utf8[sour] & (0xFF >> (bytes + 1));

++sour;

for (int i = 1; i < bytes; ++i) {

value = value << 6;

value = value | (utf8[sour] & 0x3f);

++sour;

}

 

v = (value >> 24) & 0xFF;

unicode[dest] = v;

v = (value >> 16) & 0xFF;

if (v != 0) {

unicode[dest] = (unicode[dest] << 8) + v;

++dest;

}

 

v = (value >> 8) & 0xFF;

unicode[dest] = v;

v = value & 0xFF;

if (v != 0) {

unicode[dest] = (unicode[dest] << 8) + v;

++dest;

}

}

else

if (bytes >= 4 )

{

value = utf8[sour] & (0xFF >> (bytes + 1));

++sour;

for (int i = 1; i < bytes; ++i) {

value = value << 6;

value = value | (utf8[sour] & 0x3f);

++sour;

}

value = value – 0x10000;

unicode[dest] = 0xD800 | ((value >> 10) & 0x3ff );

unicode[dest+1] = 0xDC00 | ((value) & 0x3ff);

dest = dest + 2;

}

}

 

unicode[dest] = NULL;

return dest;

}

 

Visual Studio 2022-設定UTF8編碼

Visual Studio 2022-設定UTF8編碼
Visual Studio 2022-設定UTF8編碼

『Android Studio』默認utf8編碼. 而『Visual Studio』按『地區設定』,轉本地字符編碼.

要强轉utf8可以係字加『u8』前缀

char utf8[MAX_CHAR] = u8″abcdef屌㞗𡳞杘屄”;

加『u8』前缀後,代碼移稙『Android Studio』繁鎖.可以加編譯詣令.

#pragma execution_character_set(“utf-8”)

适宜字符寫死係代碼. 若将字符保存係外部文檔,存為utf8即軟代碼.唔使諗編碼.

要强轉unicode係字加『L』前缀.USC2同USC4混埋.

wchar_t  unicode[MAX_CHAR] = L”屌㞗𡳞杘屄”;

 

Windows Hello臉部

Windows Hello臉部
Windows Hello臉部
Windows Hello臉部
Windows Hello臉部
Windows Hello臉部
Windows Hello臉部
Windows Hello臉部
Windows Hello臉部
Windows Hello臉部
Windows Hello臉部

『Kensington指紋』冇拉拉神左,睇到『Windows Hello臉部』相機模块,集成RGB&IR.Microsoft認証Win10自帶驅動. 分别係『Integrated Camera』『Integrated IR Camera』.打印相機殼,配两粒磁鐵,吸係屏上則.

發热量大,短時間臉容識別就得.

  1. 撳『設定』
  2. 撳『帳戶』
  3. 撳『登入選項』->『Windows Hello臉部』

 

經緯度座標『度分秒』轉换

經緯度座標度分秒轉换
經緯度座標度分秒轉换

經緯度座標有叄種格式,『度分秒』『度分』『度』.

『度分秒』等於『時分秒』, 『1度=60分=3600秒』『1分=60秒』

經緯度座標  
度分秒DMS DDD°MM’SS”
度分DM DDD°MM.MMM’
度D DDD.DDDDD°

 

度分秒 轉换
分轉度 除60
秒轉度 除3600
秒轉分 除60
度轉分 度小數乘60
分轉秒 分小數乘60

 

『度分秒』轉『度』

例『35°41′37.5″』即係『35度41分37.5秒』
41分轉度= 41/60
37.5秒轉度=37.5/3600
35 + 41/60 + 37.5/3600=35.69375度
void DMS_TO_DD(float D,float M,float S,double * DD)

{

*DD = D + M/60.0f + S/3600.0f;

}

 

『度分』轉『度』

例『35°41.625』即係『35度41.625分』
41.625分轉度= 41/60
35 + 41.625/60 =35.69375度
void DM_TO_DD(float D, float M, double* DD)

{

*DD = D + M / 60.0f; // 除60

}

 

『度』轉『度分』

例『35.6937632°』即係『35度41.625792分』
『0.6937632°』度轉分  0.6937632*60=41.625792′
35 + 0.6937632*60=『35°41.625792’』=『35度41.625792分』
void DD_TO_DM(double DD,int * D,float * M)

{

*D = (int)DD; // 度取整

*M = (DD – *D) * 60; // 度小數乘60

}

 

『度』轉『度分秒』

例『35.6937632°』度即係『35度, 41分, 37.54秒』
取度小數『0.6937632°』度轉分  0.6937632°*60=41.625792′
取分小數『0.625792’』分轉秒   0.625792’*60=37.54752″
35°+ 0.6937632°*60 + 0.625792’*60=『35°41′37.5″』=『35度, 41分, 37.54秒』
void DD_TO_DMS(double DD, float* D, float* M, float* S)

{

float MM;

*D = (int)DD; // 度取整

MM = (DD – *D) * 60; // 度小數乘60

*M = (int)MM;// 分

*S = (*M – MM) * 60;// 分小數乘60

}

 

1日 360度
1度 60分=3600秒
1分 60秒

 

Windows10象筋拖放

Windows10象筋拖放
Windows10象筋拖放

係Windows拖拽或者縮放窗口, 會造成窗體閃爍, 啟用象筋拖放, 即係非實時拖放,可避免窗體閃爍.

進入像筋拖放
SystemParametersInfo(SPI_SETDRAGFULLWINDOWS, true, &drag_full_windows, NULL);

 

退出像筋拖放
SystemParametersInfo(SPI_SETDRAGFULLWINDOWS, false, &drag_full_windows, NULL);

通過監聽『WM_ENTERSIZEMOVE』進入拖拽, 『WM_EXITSIZEMOVE』退出像筋拖拽, 實施像筋象筋拖放

LRESULT CALLBACK WindowProc(HWND hWnd,UINT msg,WPARAM wParam,LPARAM lParam){
    if (msg == WM_ENTERSIZEMOVE)

SystemParametersInfo(SPI_SETDRAGFULLWINDOWS, true, &drag_full_windows, NULL);// 進入像筋拖放

else

    if (msg == WM_EXITSIZEMOVE)

SystemParametersInfo(SPI_SETDRAGFULLWINDOWS, false, &drag_full_windows, NULL);// 退出像筋拖放

return(DefWindowProc(hWnd, msg, wParam, lParam));

}

 

WD BLACK AN1500 打孖插PC300-1TB

WD BLACK AN1500

WD BLACK AN1500 PC300 NVMe SK Hynix 1TB*2 CrystalDiskMark
WD BLACK AN1500 PC300 NVMe SK Hynix 1TB*2 CrystalDiskMark

WD BLACK AN1500 PC300 NVMe SK Hynix 1TB*2 CrystalDiskInfo

PC300 NVMe SK Hynix 1TB
PC300 NVMe SK Hynix 1TB
PC300 NVMe SK Hynix 1TB
PC300 NVMe SK Hynix 1TB
PC300 NVMe SK Hynix 1TB
PC300 NVMe SK Hynix 1TB
PC300 NVMe SK Hynix 1TB
PC300 NVMe SK Hynix 1TB
WD BLACK AN1500
WD BLACK AN1500
WD BLACK AN1500
WD BLACK AN1500
WD BLACK AN1500
WD BLACK AN1500
WD BLACK AN1500
WD BLACK AN1500
WD BLACK AN1500
WD BLACK AN1500
WD BLACK AN1500
WD BLACK AN1500
WD BLACK AN1500
WD BLACK AN1500

WD BLACK AN1500原配两條SN730仲有ARGB燈,有人拆出蒞䶒賣殼.睇中佢自動组建Raid0,讀寫至高達『6500MB/S』,諗住買翻『SN730-1TB』, 睇到『PC300-1TB』特價,仲係『MLC SSD』. 1TB仲係1024GB.

打孖插入『PC300-1TB』自建Raid0. 温度高達65℃. 讀『3800 MB/S』,寫『2194MB/S』. 比『SN730』慢.

WD BLACK AN1500-Raid0 PC300 NVMe SK Hynix 1TB*2
CrystalDiskMark讀 2800 MB/S
CrystalDiskMark寫 2194MB/S
CrystalDiskInfo 69℃.
MLC SSD SK Hynix H2702T8C0B3A

 

WD AN1500
上行 6500MB/S
下行 6500MB/S
總線 PCIe Gen3*4 SSD