簡単な方法:
io_lib:format("~.8B", [Mode]).
... また:
io_lib:format("~.8B", [Mode band 8#777]).
これらの2つはMode = 33204
それぞれあなたに与えるでしょう:["100664"]
と["664"]
。
長い道のり:
print(Mode) ->
print(Mode band 8#777, []).
print(0, Acc) when length(Acc) =:= 9 ->
Acc;
print(N, Acc) ->
Char = perm(N band 1, length(Acc) rem 3),
print(N bsr 1, [Char | Acc]).
perm(0, _) ->
$-;
perm(1, 0) ->
$x;
perm(1, 1) ->
$w;
perm(1, 2) ->
$r.
この1つ(関数print/1
)はMode = 33204
、結果としてこれを提供します"rw-rw-r--"
。
不明な点がある場合は、提供したスニペットの背後にある基本的なことを説明しようと思います。
@macintuxがすでに述べたように33204
、実際には8進数100664の10進数表現です。これらの3つの下位8進数(664
)はおそらく必要なものであるため、ビット単位で取得し、(band
)に適合する最大数の演算を実行します。 8進数の3桁(8#777
)。そのため、短い方法は非常に短いのです。erlangにMode
、8進数であるかのように文字列に変換するように指示するだけです。
あなたが言及した2番目の表現(たとえばrw-rw-r--
、ls
吐き出すもの)は、Mode
数値の2進表現から簡単に再現できます。3つの8進数は、正確に9つの2進数(8#644 = 2#110110100
)になることに注意してください。実際、これは、対応する数字がに等しい場合rwxrwxrwx
に各要素が置き換えられる文字列です。数字の場合、要素は変更されません。-
0
1
したがって、これを達成するための少しクリーンなアプローチがあります。
print(Mode) ->
print(Mode band 8#777, lists:reverse("rwxrwxrwx"), []).
print(0, [], Acc) ->
Acc;
print(N, [Char0 | Rest], Acc) ->
Char = char(N band 1, Char0),
print(N bsr 1, Rest, [Char | Acc]).
char(0, _) ->
$-;
char(1, C) ->
C.
私はあなたがポイントを得たことを望みます。とにかく、疑問がある場合はコメントで質問してください。