【问题标题】:Take first 16 character and covert it into hex string取前 16 个字符并将其转换为十六进制字符串
【发布时间】:2021-08-24 11:15:13
【问题描述】:

我有 UUID,3abbea88-c77d-11eb-b8bc-0242ac130003,我想获取该字符串的前 16 个字符,并希望使用 shell 脚本的前 16 个字符的十六进制字符串。

我试过了,

code=$(echo -n ${${ID##*:}:0:16} | od -A n -t x1)
HEX_ID=$(echo ${code//[[:blank:]]/})

还有更好的方法吗?

预期输出:33616262656138382d633737642d3131

【问题讨论】:

  • 你为什么要${##*:}
  • 这段代码将抓取连字符 (-) 并获取它们的十六进制代码,从而产生一些 2d 条目,这是您想要的吗?还是您想清除它们并只保留“前 16 个相关字符”?
  • ${ID##*:} 看起来您的 UUID 前面有一些您没有在问题中显示的文本。请编辑您的问题以保持一致。

标签: bash shell sh


【解决方案1】:

hexdump 全部搞定:

hexdump -n 16 -ve '1/1 "%.2x"'

-n 16 表示只处理前 16 个字节
-e '1/1 "%.2x"' 表示使用给定的 printf 格式显示每个字节
-v 表示正常显示(没有这个,它将用* 替换欺骗部分?)


echo '3abbea88-c77d-11eb-b8bc-0242ac130003' | hexdump -n 16 -ve '1/1 "%.2x"'

输出:

33616262656138382d633737642d3131

【讨论】:

    【解决方案2】:

    仅限 Bash:

     while read -r -N 1 c                      # read input string 1 char at a time
     do [[ "$c" == " " ]] ||                   # skip embedded spaces
         printf "%02X" "$(                     # output the hexidecimal value of 
           printf "%d" \'$c                    # the ASCII decimal ordinal of $c
         )" 
     done <<< "${text##*:}"                    # ignoring the leading trash to the :
     echo                                      # newline-teminate the output
    

    一条龙:

     while read -rn1 c;do [[ "$c" == " " ]]||printf %02X $(printf "%d" \'$c);done<<<"${text##*:}";echo
    

    这不是最快的方法...

    【讨论】:

      【解决方案3】:

      使用 od 您可以使用 -N 选项简单地限制读取的字符数:

      HEX_ID=$(od -A n -t x1 -N 16 <<< ${ID##*:} | tr -dc '[:xdigit:]')
      

      编辑:tr 用于抑制非十六进制字符,即空格和潜在的换行符。

      【讨论】:

        【解决方案4】:

        Perl 来救援!

        perl -le 'print unpack "H32", shift' 3abbea88-c77d-11eb-b8bc-0242ac130003
        
        • -l 将换行符添加到 print
        • unpack 接受一个字符串并将其扩展为基于模板的值列表。 H32 表示“获取字符并将其解释为 32 个十六进制值”。
        • shift 读取第一个命令行参数。

        或者,使用xxdhead

        echo 3abbea88-c77d-11eb-b8bc-0242ac130003 | xxd -p | head -c32
        

        【讨论】:

        • 我不是 Perl 专家,但你说 H32 的意思是“取 32 个字符并将它们解释为十六进制”。如果是这种情况,它将读取 32 个字符并输出 64 个十六进制数字。我会假设它首先转换为十六进制,然后 然后 保留 32 个字符,对吗?
        【解决方案5】:

        那肯定是useless echo.

        应该是avoid uppercase for your private variables.

        uuid='3abbea88-c77d-11eb-b8bc-0242ac130003'
        tmp=${uuid//-/}
        hex_id=$(od -A n -t x1 <<<${tmp:0:13})
        hex_id=${hex_id//[[:blank:]]/}
        hex_id=${hex_id%0a}
        

        here 字符串不美观地向od 提供尾随换行符,我们必须将其剪掉。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2018-01-31
          • 1970-01-01
          • 2015-07-20
          • 2013-02-07
          • 1970-01-01
          • 2018-01-26
          • 2014-12-04
          • 1970-01-01
          相关资源
          最近更新 更多