文字列をn文字ずつに分割する
hexファイルやmotファイルとかでチェックサムとる為に、16進文字列を2文字ずつに区切って加算するってやつ。
Perl
quartz:pts/3% perl -E 'foreach $i (shift =~ /../g) { $sum += hex($i); } say sprintf "%x", $sum' CAFEBABE or quartz:pts/3% perl -MList::Util=sum -E 'say sprintf "%x", (sum( map {hex} shift =~ /../g));' CAFEBABE 340
追記: List::Util忘れてた。
Python
pythonなら re.findallを使って
quartz:pts/3% python -c 'import re,sys; print hex(sum([int(x,16) for x in re.findall("..", sys.argv[1])]))' CAFEBABE 0x340
とかすればいいんだけど、rubyでやろうとしてふと困ってしまった。結局面倒になって pythonでやってる自分がいた。怠け者め。
Ruby
さらに追記:
これでいいのかな。
quartz:pts/1% ruby -e 's=0; ARGV[0].gsub(/../) {|x| s+=x.hex}; puts s.to_s(16)' cafebabe 340
なんかすごくダサい気もするんだけど・・・
Haskell
ワルノリ
import System import Numeric hex :: [Char] -> [Int] hex [] = [] hex (c:c':rest) = (fst . head . readHex) [c,c'] : hex rest checksum = sum . hex main = do cs <- getArgs print $ (flip showHex "" . checksum . head) cs
quartz:pts/1% ./checksum cafebabe /home/kuro "340"
暇だなおいら。