首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >输出到BC HexToDec计算

输出到BC HexToDec计算
EN

Stack Overflow用户
提问于 2018-02-12 14:05:58
回答 3查看 424关注 0票数 1

我试图将awkbc结合起来,以便创建一个bash函数,以便快速地将十六进制值转换成适当的格式。

代码语言:javascript
复制
echo FFFFFF | VAR=$(awk '{print toupper($0)}') | "ibase=16; $((((($VAR - 5) / 100) - 1000)))" | bc

我正在尝试这样做,但我似乎无法将awk的输出输入到bc参数的输入中。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2018-02-12 15:04:51

尽管您尝试使用awkbc来实现它,但我在这里给您提供了最方便的选项:printf。这使得您可以轻松地在十进制、八进制和十六进制之间进行转换。

代码语言:javascript
复制
[bash] % printf "%d" 0xFFFFFF    # hex2dec
16777215
[bash] % printf "%#O" 0xFFFFFF   # hex2oct
077777777
[bash] % printf "%d" 077777777   # oct2dec
16777215
[bash] % printf "%d" 077777777   # oct2hex
0xFFFFFF
[bash] % printf "%#x" 16777215   # dec2hex
0xFFFFFF
[bash] % printf "%#O" 16777215   # dec2oct
077777777

额外的字符#要求printf插入十六进制数字的前缀0X,八进制数字的0。如果以十六进制形式添加数字,请不要忘记在数字中添加前缀0x,为八进制数字添加0

当然,bash可以选择做算术运算。

man bash((expression))表达式根据下面在算术计算下描述的规则进行计算。如果表达式的值为非零,则返回状态为0;否则返回状态为1。这完全等同于let "expression"

这允许您直接执行所有的计算。例如:您想要0xFFFFFF并减去小数点5,除以100 (小数)和减去1000小数点,您就有

代码语言:javascript
复制
[bash] % printf "%d" $(( (0xFFFFFF - 5)/100 - 1000 ))
166772

或者你可以做所有的十六进制::

代码语言:javascript
复制
[bash] % printf "%d" $(( (0xFFFFFF - 0x5)/0x100 - 0x1000 ))
61439

如果您现在想将这样的数字存储在变量中,您只需这样做。

代码语言:javascript
复制
[bash] % vardec=$( printf "%d" $(( (0xFFFFFF - 0x5)/0x100 - 0x1000 )) )
[bash] % varhex=$( printf "%#x" $(( (0xFFFFFF - 0x5)/0x100 - 0x1000 )) )
[bash] % varoct=$( printf "%#O" $(( (0xFFFFFF - 0x5)/0x100 - 0x1000 )) )

但是,十进制是一个特例,您可以去掉printf

代码语言:javascript
复制
[bash] % vardec=$(( (0xFFFFFF - 0x5)/0x100 - 0x1000 ))

bash的算术评估系统允许您将任意数字写入任意基(最多为64),并将其转换为十进制。在这里,我将一个基数3的数字3#1212转换为数字50。

代码语言:javascript
复制
[bash] % echo $(( 3#1212 ))
50

如果要使用zsh,,则可以将其转换回任何其他基础:

代码语言:javascript
复制
[zsh] % echo $(( [##2]7 ))            # from base 10 to base 2
111
[zsh] % echo $(( [##5]3#1020101100 )) # from base 3 to base 5
1234321
[zsh] % echo $(( [##36]17#415C67A8 )) # from base 17 to base 36
ROFLOL
票数 3
EN

Stack Overflow用户

发布于 2018-02-12 14:11:52

试一试

代码语言:javascript
复制
 echo FFFFFF |
 awk '{printf "ibase=16\n(((((%s - 5) / 100) - 1000)))\n",toupper($1) ;}' |
 bc

(这可以是内联的,确保|是排在最后一个字符)

原稿

代码语言:javascript
复制
echo FFFFFF | VAR=$(awk '{print toupper($0)}') 
  • awk没有输入,VAR为空 Ibase=16;$($VAR- 5) / 100) -1000))“
  • "ibase=... "是一个命令,这不是您想要的,它什么也不输出(保存错误)。

更复杂的公式

代码语言:javascript
复制
VAR=$(echo FFFFFF | tr [:lower:] [:upper:])
VAR2=..
VARx=...
bc <<EOF
ibase=16
((($VAR - 5) / $VAR2) - $VARx)
EOF

哪里

  • bc <<EOF被称为黑尔多变量,在运行时会被埋伏。
票数 3
EN

Stack Overflow用户

发布于 2018-02-12 15:11:45

您没有提供任何示例输入或预期输出,但这是您想要做的吗?

代码语言:javascript
复制
$ echo FFFFFF | awk '{print strtonum("0x"$0)}'
16777215

$  echo FFFFFF | awk '{print ((strtonum("0x"$0) - 5) / 100) - 1000}'
166772

上面的strtonum()使用GNU awk将非十进制字符串转换为数值,大小写并不重要:

代码语言:javascript
复制
$  echo ffffff | awk '{print ((strtonum("0x"$0) - 5) / 100) - 1000}'
166772

或者你的"100“之类的意思也是指妖术?

代码语言:javascript
复制
$ echo FFFFFF | awk '{print ((strtonum("0x"$0) - strtonum("0x5")) / strtonum("0x100")) - strtonum("0x1000")}'
61440

请注意,计算的结果实际上是一个浮点数,因此,当将其打印为整数时,上述四舍五入适用于此:

代码语言:javascript
复制
$ echo FFFFFF | awk '{printf "%f\n", ((strtonum("0x"$0) - strtonum("0x5")) / strtonum("0x100")) - strtonum("0x1000")}'
61439.976562

我一开始使用的是gawk专用的-n选项,但实际上应该避免使用strtonum(),参见https://www.gnu.org/software/gawk/manual/gawk.html#Nondecimal-Data

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48748346

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档