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 次浏览

开启你的职业生涯

通过完成课程获得认证

开始学习
广告