Haskell程式:資料轉換為十六進位制


在Haskell中,我們將使用`intToDigit`、`toHex`和`showHex`函式將資料轉換為十六進位制。在第一個示例中,我們將使用`toHex`函式和`(stringToHex = concatMap (\c -> toHex (fromEnum c)))`函式;在第二個示例中,我們將使用`convertToHex x = showHex x ""`;在第三個示例中,我們將使用`(toHex = concatMap toHexChar)`。

方法一:使用`intToDigit`和`toHex`函式將資料轉換為十六進位制

在此方法中,`toHex`函式透過反覆除以16並將每個餘數使用`intToDigit`轉換為數字來將整數轉換為其十六進位制表示形式。結果被反轉,以便最低有效位排在最前面。`stringToHex`函式使用`fromEnum`將輸入字串中的每個字元轉換為整數,然後對每個整數呼叫`toHex`以獲得其十六進位制表示形式。生成的十六進位制數字被連線起來,形成最終的輸出字串。

演算法

  • 步驟1 − 匯入`Data.Char`模組。

  • 步驟2 − 定義`toHex`函式如下:

    toHex x = reverse (toHex' x)

    其中

    toHex' 0 = "0"

    toHex' n = let (q, r) = n `divMod` 16

    in if q == 0

    then [intToDigit r]

    else intToDigit r : toHex' q.

    `stringToHex`函式定義如下:

    stringToHex = concatMap (\c -> toHex (fromEnum c)).

  • 步驟3 − 程式執行將從`main`函式開始。`main()`函式控制整個程式。它被編寫為`main = do`。

  • 步驟4 − 使用某些資料呼叫`stringToHex`函式。

  • 步驟5 − 將對應於資料的十六進位制值列印到控制檯。

示例1

在此示例中,使用`intToDigit`和`toHex`函式將資料轉換為十六進位制。

import Data.Char (intToDigit)

toHex :: Int -> String
toHex x = reverse (toHex' x)
   where
      toHex' 0 = "0"
      toHex' n = let (q, r) = n `divMod` 16
         in if q == 0
            then [intToDigit r]
            else intToDigit r : toHex' q

stringToHex :: String -> String
stringToHex = concatMap (\c -> toHex (fromEnum c))

main :: IO ()
main = putStrLn $ stringToHex "hello world 123"

輸出

[1 of 1] Compiling Main             ( main.hs, main.o )
Linking main ...
68656c6c6f20776f726c642031323

方法二:使用`showHex`函式將資料轉換為十六進位制

在此方法中,`convertToHex`函式採用任何`Integral`型別的數值,並使用`showHex`函式將其轉換為十六進位制字串。`showHex`的第二個引數是一個附加到十六進位制表示形式末尾的字串,在本例中我們將其留空。

演算法

  • 步驟1 − 匯入`Numeric`模組。

  • 步驟2 − 使用`showHex`函式定義`convertToHex`函式如下:

    convertToHex x = showHex x "".

  • 步驟3 − 程式執行將從`main`函式開始。`main()`函式控制整個程式。它被編寫為`main = do`。

  • 步驟4 − 使用某些值呼叫`convertToHex`函式。

  • 步驟5 − 將對應於資料值的十六進位制值列印到控制檯。

示例1

在此示例中,使用`showHex`函式將資料轉換為十六進位制。

import Numeric (showHex)

convertToHex :: (Integral a, Show a) => a -> String
convertToHex x = showHex x ""

main :: IO ()
main = do
  let value = 255
      hex = convertToHex value
  putStrLn hex 

輸出

[1 of 1] Compiling Main             ( main.hs, main.o )
Linking main ...
ff

示例2

在此示例中,使用`showHex`函式將資料轉換為十六進位制。

import Numeric

dataToHex :: (Integral a, Show a) => a -> String
dataToHex n = "0x" ++ showHex n ""

main :: IO ()
main = do
  let num = 255 :: Int
  putStrLn $ dataToHex num 

輸出

[1 of 1] Compiling Main             ( main.hs, main.o )
Linking main ...
0xff

方法三:使用`concatMap`和`toEnum`函式將資料轉換為十六進位制

在此方法中,`toHex`函式接受一個字串作為輸入,並使用`concatMap`將`toHexChar`函式應用於字串中的每個字元。`toHexChar`函式透過計算字元的整數值,然後計算整數的每個四位位元組(nibble)的十六進位制數字來將單個字元轉換為其十六進位制表示形式。生成的十六進位制數字連線成一個字串並返回。

演算法

  • 步驟1 − 定義`toHex`函式如下:

    toHex = concatMap toHexChar

    其中

    toHexChar c =

    let

    n = fromEnum c

    hexDigit x

    | x < 10 = toEnum (x + 48)

    | otherwise = toEnum (x + 55)

    in [hexDigit (n `div` 16), hexDigit (n `mod` 16)].

  • 步驟2 − 程式執行將從`main`函式開始。`main()`函式控制整個程式。它被編寫為`main = do`。

  • 步驟3 − 使用某些值呼叫`toHex`函式。

  • 步驟4 − 將對應於資料值的十六進位制值列印到控制檯。

示例1

在此示例中,使用`concatMap`和`toEnum`函式將資料轉換為十六進位制。

toHex :: String -> String
toHex = concatMap toHexChar
  where
    toHexChar c =
      let
        n = fromEnum c
        hexDigit x
          | x < 10    = toEnum (x + 48)
          | otherwise = toEnum (x + 55)
      in [hexDigit (n `div` 16), hexDigit (n `mod` 16)]
main :: IO ()
main = putStrLn $ toHex "hello world 123" 

輸出

[1 of 1] Compiling Main             ( main.hs, main.o )
Linking main ...
68656C6C6F20776F726C6420313233

結論

在Haskell中,資料到十六進位制的轉換是指將給定的資料或值轉換為十六進位制字串的過程。十六進位制表示是一種常用的表示二進位制資料或記憶體地址的格式,因為它易於閱讀和編寫。在Haskell中,有多種方法可以執行此轉換,具體取決於所需的實現和要求。

更新於:2023年3月28日

497 次瀏覽

開啟你的職業生涯

透過完成課程獲得認證

開始學習
廣告