我似乎无法理解在线课程中给出的这个问题的解决方案。我找到了解决它的实际代码,但我仍然不明白。谁能更详细地向我解释一下为什么会这样做?我将非常感激。
Linux系统中文件的权限分为三组三种权限:所有者、组和其他人的读、写和执行。这三个值中的每一个都可以表示为每个权限之和的八进制数,其中4对应于读取,2对应于写入,1对应于执行。或者,当未授予权限时,可以使用字母 r、w 和 x 或 - 来编写字符串。 例如: 640为所有者读/写,组读,其他人无权限;转换为字符串,它将是:“rw-r-----” 755为所有者读/写/执行,为组等读/执行;转换为字符串,它将是:“rwxr-xr-x” 填空使代码将八进制格式的权限转换为字符串格式。我对 for 循环的行感到困惑 - 我只是不明白它。
我在互联网上找到的Soultion(工作正常):
def octal_to_string(octal):
result = ""
value_letters = [(4,"r"),(2,"w"),(1,"x")]
# Iterate over each of the digits in octal
for i in [int(n) for n in str(octal)]:
# Check for each of the permissions values
for value, letter in value_letters:
if i >= value:
result += letter
i -= value
else:
result += '-'
return result
print(octal_to_string(755)) # Should be rwxr-xr-x
print(octal_to_string(644)) # Should be rw-r--r--
print(octal_to_string(750)) # Should be rwxr-x---
print(octal_to_string(600)) # Should be rw-------
我相信您已经意识到,每个八进制数字(oit?octit?)对应于一组由各个权限总和给出的权限。
0 = ---
1 = --x
2 = -w-
3 = -wx
4 = r--
5 = r-x
6 = rw-
7 = rwx
我们可以通过从八进制数字中减去每个权限对应的值来得出这个字符串。
(6, '') -> (2, 'r') -> (0, 'rw') -> (0, 'rw-')
对于循环行,由于
octal
变量是一个 3 位(八进制)整数,我们首先将其转换为字符串,分隔每个字符以获得单独的八进制数字,然后将它们转换回整数,这样我们就可以处理它们。我们没有为每个操作编写单独的语句,而是使用列表理解来生成我们将循环的八进制数字列表。
我认为这段代码不是理解如何将八进制权限转换为字符串的最佳示例
看我的例子
def octal_to_string(octal):
result = ''
for i in str(octal):
result += 'r' if int(i) & 0b100 else '-'
result += 'w' if int(i) & 0b010 else '-'
result += 'x' if int(i) & 0b001 else '-'
return result
print(octal_to_string(755)) # Should be rwxr-xr-x
print(octal_to_string(644)) # Should be rw-r--r--
print(octal_to_string(750)) # Should be rwxr-x---
print(octal_to_string(600)) # Should be rw-------