#1の回答を編集

#1の回答を編集

テキストファイルの10進値のリストを16進形式に変換する必要があります。たとえば、test.txt には以下を含めることができます。

131072
196608
262144
327680
393216
...

出力は16進値のリストでなければなりません(前に0がある8桁の16進数)。

00020000
00030000
00040000
...

出力はテキストファイルとして印刷されます。 PythonまたはLinuxシェルスクリプトを使用してこれを達成するにはどうすればよいですか?

編集#1

800000001つの追加作業を逃しました。生成された各16進値に16進数を追加する必要があります。 (算術加算、生成された16進値のリストに適用されます)

答え1

printf以下を使用してこれを行うことができますbash

printf '%08x\n' $(< test.txt)

またはprintfとbcを使用してください...ただ...なぜですか?

printf '%08s\n' $(bc <<<"obase=16; $(< test.txt)")

出力をテキストファイルとして印刷するには、>次のようにシェルリダイレクトを使用します。

printf '%08x\n' $(< test.txt) > output.txt

答え2

使用awk:

$ awk '/[0-9]/ { printf("%08x\n", $0) }' file
00020000
00030000
00040000
00050000
00060000

答え3

3つの可能な解決策(各行が次のセットであると仮定)ただ数字):

ksh、bash、zshなどのシェルの場合:

printf '%08x\n' $(<infile)

bashでのみ動作します

<file.txt mapfile -t arr;   printf '%08x\n' "${arr[@]}" 

より単純なシェルの場合:dash(Debianベースのシステムのデフォルトsh)、ash(busyboxエミュレートシェル)、yash、AIXとSolarisの一部のデフォルトシェル:

printf '%08x\n' $(cat infile)

実際、Heirloomバージョン(Bourneに似ています)のようなシェルの場合は、次のように書く必要があります(上記のすべてのposixシェルで動作しますが、強くお勧めします)使用しないでください):

$ printf '%08x\n' `cat infile`

#1の回答を編集

16進値を理解すると、8000000032ビットシステムでオーバーフローが発生します(現在は一般的ではありませんが可能です)。負の値を印刷したくない場合に選択しますecho "$((0x80000000))"

$ for i in $(<infile); do printf '%08x\n' "$(($i+0x80000000))"; done
80020000
80030000
80040000
80050000
80060000

答え4

ジュリアを使う

$ julia -e 'function hexadd(x) hex(( x + 0x80000000),8) end ; output = open("output.txt","w") ; open("test.txt") do inputfile for num in eachline(inputfile) write(output,"$(hexadd(parse(Int,num)))\n") end end'

複数行を読む方が簡単になります。

function hexadd(x)
    hex(( x + 0x80000000),8)
end
output = open("output.txt","w")
open("test.txt") do inputfile
    for num in eachline(inputfile)
        write(output,"$(hexadd(parse(Int,num)))\n")
    end
end
  • hex( value, pad)値を16進数に変換し、必要に応じてパディングを追加します。
    hexadd入力に整数が必要なので、文字列(の出力eachline)をIntwithに変換して関数parse(Int,"string")で使用します。
  • julia -e式を評価します。
  • JuliaはFedoraとUbuntuにデフォルトでインストールできます。

直流使用:

$ dc -f test.txt -e '16o16i[80000000+psaz1<r]dsrx80000000+p' > output.txt

説明する:

  • dc -f test.txt -e '16o 16i [80000000 + p sa z 1 <r] sr z 1 <r 80000000 + p' > output.txt
  • -f fileファイルの内容をスタックにプッシュします。
  • -e式の実行
  • 16o出力を16進数に変換
  • 16i入力が16進数であるとします。これはファイルを読み取った後に発生するため、ファイルはデフォルトの10として読み込まれます。もっと具体的に言えば、私はできるdc -e '10i' -f file -e '16 i 8000000'
  • [...]文字列をスタックに押し込みます。この文字列はマクロとして使用されます。
  • 80000000 +スタックの現在の最上位を16進数80000000に追加します。結果をスタックの一番上にプッシュします。
  • pポップせずにスタックの現在のトップを印刷します。改行文字を印刷する唯一の印刷オプションです。
  • saスタックの上部をポップしてレジスタ「a」に保存します。絶対に使わず、袋の上部を取り除くための方法に過ぎません。
  • z現在、スタックの上部にはスタックの深さがあります。再帰呼び出しを終了する必要があります。
  • 11をスタックの一番上にプッシュします。以前のプッシュのスタック深さ(z)と比較するのに役立ちます。
  • <rスタック内の2つの値を比較して、2番目の値が1番目の値より小さい場合は、レジスタ「r」を実行します。実際、スタックの深さを「1」と比較します。
  • srレジスタ「r」にポップして保存します。マクロはレジスタ "r" にあり、スタックの深さが 1 より大きい限り実行されます。まだ何も呼び出していません。
  • dスタックの上部をコピーしてプッシュします。
  • xマクロ実行スタックの最上位。
  • d sr xマクロをコピーしてプッシュすると、スタックに2つのコピーがあり、親コピーをポップして保存して登録し、2番目のコピーをポップして実行します。
  • そのため、スタックの深さと1をプッシュして比較して実行し、最後の要素に再度hex値を追加して印刷します。

関連情報