Linux 将十六进制转换为有符号十进制的Awk命令

Linux 将十六进制转换为有符号十进制的Awk命令,linux,bash,shell,awk,text-editor,Linux,Bash,Shell,Awk,Text Editor,我有一个文本文件,它由3列十六进制数字组成(值是可变的,这些值仅用作示例): 我想将这些数字转换为带符号的十进制数,并以相同的结构打印它们,所以我做到了: awk '{x="0x"$1; y="0x"$2; z="0x"$3; printf ("%d %d %d" x,y,z);}' input_file.txt > output_file.txt 作为输出得到的列表只包含无符号值。您可以使用awk函数从两个补码进行转换: function hex2i

我有一个文本文件,它由3列十六进制数字组成(值是可变的,这些值仅用作示例):

我想将这些数字转换为带符号的十进制数,并以相同的结构打印它们,所以我做到了:

awk '{x="0x"$1;
      y="0x"$2;
      z="0x"$3;
      printf ("%d %d %d" x,y,z);}' input_file.txt > output_file.txt

作为输出得到的列表只包含无符号值。

您可以使用
awk
函数从两个补码进行
转换:

function hex2int( hexstr, nbits )
{
    max = 2 ^ nbits
    med = max / 2

    num = strtonum( "0x" hexstr )

    return ((num < med) ? num : ( (num > med) ? num - max  :  -med ))
}
8bit
转换示例:

print hex2int( "7", 4 ) # +7
print hex2int( "2", 4 ) # +2
print hex2int( "1", 4 ) # +1
print hex2int( "0", 4 ) # 0
print hex2int( "f", 4 ) # -1
print hex2int( "d", 4 ) # -3
print hex2int( "9", 4 ) # -7
print hex2int( "8", 4 ) # -8
print hex2int( "7f", 8 ) # +127
print hex2int( "40", 8 ) # +64
print hex2int( "01", 8 ) # +1
print hex2int( "00", 8 ) # 0
print hex2int( "ff", 8 ) # -1
print hex2int( "40", 8 ) # -64
print hex2int( "81", 8 ) # -127
print hex2int( "80", 8 ) # -128
使用
16位
转换将所有内容组合在一起:

#!/bin/awk

function hex2int( hex )
{
    num = strtonum( "0x" hex )

    return ((num < med) ? num : ( (num > med) ? num - max  :  -med ))
}

BEGIN {
    nbits = 16
    max = 2 ^ nbits
    med = max / 2
}

{
    for( i = 1; i <= NF; i++ )
    {
        if( NR == 1 )
        {
            printf "%s%s", $i, OFS
        }
        else
        {
            printf "%d%s", hex2int($i), OFS
        }
    }

    printf "%s", ORS
}

# eof #
测试:

$ awk -f script.awk -- input.txt 
输出:

X Y Z 
2570 2827 3084 
-21555 -4351 4660 
-1 -1286 -17734 
4779 -21558 17185 
参考资料:


希望有帮助

您可以使用
awk
函数从两个补码进行
转换:

function hex2int( hexstr, nbits )
{
    max = 2 ^ nbits
    med = max / 2

    num = strtonum( "0x" hexstr )

    return ((num < med) ? num : ( (num > med) ? num - max  :  -med ))
}
8bit
转换示例:

print hex2int( "7", 4 ) # +7
print hex2int( "2", 4 ) # +2
print hex2int( "1", 4 ) # +1
print hex2int( "0", 4 ) # 0
print hex2int( "f", 4 ) # -1
print hex2int( "d", 4 ) # -3
print hex2int( "9", 4 ) # -7
print hex2int( "8", 4 ) # -8
print hex2int( "7f", 8 ) # +127
print hex2int( "40", 8 ) # +64
print hex2int( "01", 8 ) # +1
print hex2int( "00", 8 ) # 0
print hex2int( "ff", 8 ) # -1
print hex2int( "40", 8 ) # -64
print hex2int( "81", 8 ) # -127
print hex2int( "80", 8 ) # -128
使用
16位
转换将所有内容组合在一起:

#!/bin/awk

function hex2int( hex )
{
    num = strtonum( "0x" hex )

    return ((num < med) ? num : ( (num > med) ? num - max  :  -med ))
}

BEGIN {
    nbits = 16
    max = 2 ^ nbits
    med = max / 2
}

{
    for( i = 1; i <= NF; i++ )
    {
        if( NR == 1 )
        {
            printf "%s%s", $i, OFS
        }
        else
        {
            printf "%d%s", hex2int($i), OFS
        }
    }

    printf "%s", ORS
}

# eof #
测试:

$ awk -f script.awk -- input.txt 
输出:

X Y Z 
2570 2827 3084 
-21555 -4351 4660 
-1 -1286 -17734 
4779 -21558 17185 
参考资料:


希望有帮助

由于示例输入中的十六进制数都以零字节开头,因此通常认为它们是正数。是否应将其中任何一项视为负数?您是否可以发布您的预期输出?而给出的awk代码段有语法问题,WK不支持它,尝试使用这里描述的黑客来证明awk无法使用int2hex awk'{printf“%x/n”,-1}'它会告诉您ffffffffffffff try backward awk'{printf“%d/n,0xffffffffffffffff”}您将得到一个巨大的正整数。这与shell printf命令相同。预期输出?由于示例输入中的十六进制数都以零字节开始,因此它们通常被视为正。是否应将其中任何一项视为负数?您是否可以发布您的预期输出?而给出的awk代码段有语法问题,WK不支持它,尝试使用这里描述的黑客来证明awk无法使用int2hex awk'{printf“%x/n”,-1}'它会告诉您ffffffffffffff try backward awk'{printf“%d/n,0xffffffffffffffff”}您将得到一个巨大的正整数。这与shell printf命令相同。预期输出?是否返回(num
作为一个更简单的替代方案工作?
会返回(num
是否可以作为更简单的替代方案?