中文工具 / 電子工具

進位轉換

二進位、十進位、十六進位互轉,順便看 ASCII 字元和位元組順序;也能把文字和 ASCII、UTF-8 代碼互轉。

數字進位轉換

位元數(選 8~64 位元才能輸入負數,會用二補數表示)

文字和 ASCII 代碼互轉

代碼格式

結果不對或有錯字?填寫意見回饋

二進位、十進位、十六進位怎麼換算?

二進位的每一位從右邊數起代表 1、2、4、8、16、32、64、128……,把是 1 的位數加起來就是十進位。例如 0100 0001 = 64 + 1 = 65。

十進位轉二進位,就從最大的 2 的次方開始扣:65 = 64 + 1,所以第 7 位和第 1 位是 1,其他是 0。

十六進位用 0~9 和 A~F 表示 0~15,剛好等於 4 個二進位位元。所以二進位每 4 位一組,一組換成一個十六進位數字就好:0100 0001 → 4、1 → 0x41。這也是韌體和資料手冊都用十六進位寫暫存器值的原因。

十進位二進位十六進位十進位二進位十六進位
000000810008
100011910019
200102101010A
300113111011B
401004121100C
501015131101D
601106141110E
701117151111F

負數和二補數

電腦用二補數(two’s complement)存負數:把正數的每一位反過來再加 1。8 位元的 -1 是 1111 1111(0xFF),-128 是 1000 0000(0x80)。同一組位元,當成無號數是 255,當成有號數是 -1,看程式怎麼宣告。

上面的工具選了位元數之後,可以在十進位輸入負數,結果會列出「有號十進位」。各位元數的範圍:

位元數無號範圍有號範圍C 型別
80~255-128~127uint8_t/int8_t
160~65,535-32,768~32,767uint16_t/int16_t
320~4,294,967,295-2,147,483,648~2,147,483,647uint32_t/int32_t
640~約 1.8 × 10¹⁹約 ±9.2 × 10¹⁸uint64_t/int64_t

ASCII 對照表

ASCII 用 0~127 代表英文字母、數字、標點和控制字元。0~31 和 127 是控制字元,例如 LF(換行,0x0A)、CR(歸位,0x0D)、ESC(0x1B);32 是空白(SP)。幾個好記的規則:數字 0~9 是 0x30~0x39,大寫 A 是 0x41,小寫 a 是 0x61,大小寫剛好差 0x20。

十進位十六字元十進位十六字元十進位十六字元十進位十六字元
000NUL3220SP6440@9660`
101SOH3321!6541A9761a
202STX3422"6642B9862b
303ETX3523#6743C9963c
404EOT3624$6844D10064d
505ENQ3725%6945E10165e
606ACK3826&7046F10266f
707BEL3927'7147G10367g
808BS4028(7248H10468h
909HT4129)7349I10569i
100ALF422A*744AJ1066Aj
110BVT432B+754BK1076Bk
120CFF442C,764CL1086Cl
130DCR452D-774DM1096Dm
140ESO462E.784EN1106En
150FSI472F/794FO1116Fo
1610DLE483008050P11270p
1711DC1493118151Q11371q
1812DC2503228252R11472r
1913DC3513338353S11573s
2014DC4523448454T11674t
2115NAK533558555U11775u
2216SYN543668656V11876v
2317ETB553778757W11977w
2418CAN563888858X12078x
2519EM573998959Y12179y
261ASUB583A:905AZ1227Az
271BESC593B;915B[1237B{
281CFS603C<925C\1247C|
291DGS613D=935D]1257D}
301ERS623E>945E^1267E~
311FUS633F?955F_1277FDEL

常見問題

十六進位前面的 0x 是什麼意思?

0x 只是標示「這是十六進位」,不是數值的一部分,0x41 和 41h、$41 都是同一個數。C、Python、JavaScript 用 0x,組合語言常用 h 結尾。二進位則常用 0b 開頭。這個工具輸入時加不加都可以。

大端序和小端序有什麼不同?

多位元組的數字存到記憶體或送出去時,大端序(big-endian)先放最高的位元組,小端序(little-endian)先放最低的。0x12345678 用大端序是 12 34 56 78,小端序是 78 56 34 12。ARM Cortex-M(STM32)和 x86 是小端序,網路協定和很多感測器的暫存器是大端序。用邏輯分析儀或 UART 看到的位元組順序反過來時,多半就是這個原因。

中文字可以轉成 ASCII 嗎?

不行,ASCII 只有 128 個字元,沒有中文。現在網頁和多數程式用 UTF-8:英文字母和 ASCII 一樣是一個位元組,中文字通常是 3 個位元組,例如「你」是 E4 BD A0。舊系統用的 Big5 編碼不一樣,這個工具只支援 UTF-8。

為什麼數字 0 的 ASCII 碼是 48?

因為 ASCII 把 0~9 排在 0x30~0x39。從 UART 收到的字元 '7' 其實是 0x37,要減掉 0x30(或 '0')才會變成數字 7,這是寫韌體常見的錯誤。