os.Getenv() 的反向函數或函式庫
php小编苹果今天要为大家介绍的是os.Getenv() 的反向函数或库。在开发中,我们常常需要获取环境变量的值,而os.Getenv() 是一个常用的函数。但是有时候,我们需要根据某个值来获取对应的环境变量名称,这时候就需要一个反向的函数或库来实现了。下面我们将为大家介绍一些常用的方法来实现这个功能。
问题内容
我有一个 reg_expand_sz 类型的十六进制字符串列表。 样本: reg,[hkey_local_machine\softwar\wow6432node], "pathethic"=hex(2):43,00,3a,00,5c,00,57,00,49,00,4e,00,44,00,4f,00 ,57,00,53,00,\00,00 //忽略解析和格式化部分。
我需要将其转换为原始字符串。
预期输出: %systemroot%
实际输出: c:\windows
问题是,当用户最初运行命令终端时,它会展开: reg add hkey_local_machine\softwar\wow6432node /v pathetic /t reg_expand_sz /d "%systemroot%"。稍后使用实际扩展的字符串。例如:初始 %systemroot% = 实际 c:\windows。当我将十六进制字符串转换为常规字符串时,我得到 c:\windows。
这就是为什么我想知道是否有任何库或工具可以通过提供值来获取密钥,即反向。 c:\window :=os.getenv(???).
package main import ( "encoding/hex" "fmt" "log" "os" ) func ctogostring(b []byte) string { var buf []byte for _, c := range b { if c != 0 { buf = append(buf, c) } } return string(buf) } func main() { str := "43003a005c00570049004e0044004f00570053000000" //%systemroot% bs, err := hex.decodestring(str) if err != nil { panic(err) } //s := ctogostring(bs) result := ctogostring(bs) fmt.println(result) f, err := os.openfile("rollback.bat", os.o_rdwr|os.o_create|os.o_trunc, 0755) if err != nil { log.fatal(err) } f.writestring(result + "\n") }
我尝试过手动执行此操作,但扩展的字符串比我预期的要多。因此,我的程序是有限的。请告知此问题的任何解决方案。 `
func reverseEnvVar(value string) string { // Use os.ExpandEnv() to expand environment variables in the input string expanded := os.ExpandEnv(value) // Check if the expanded string matches a known environment variable value switch expanded { case os.Getenv("SystemRoot"): return "%systemroot%" case os.Getenv("ProgramFiles"): return "%programfiles%" case os.Getenv("ProgramFiles(x86)"): return "%programfiles(x86)%" case os.Getenv("AppData"): return "%appdata%" case os.Getenv("LocalAppData"): return "%localappdata%" case os.Getenv("UserProfile"): return "%userprofile%" case os.Getenv("TEMP"): return "%temp%" case os.Getenv("TMP"): return "%tmp%" default: // If the expanded string doesn't match a known environment variable value, // return the original input value return value } }
解决方法
我没有找到一个接受 c:\windows
并提供 %systemroot%
的库,但它可以使用 os.environ()
轻松实现。
进口:
import ( "errors" "fmt" "os" "strings" )
值 -> 键数组的哈希映射:
func createenvhashmap() map[string][]string { envmap := make(map[string][]string) for _, env := range os.environ() { pair := strings.splitn(env, "=", 2) if len(pair) == 2 { key := fmt.sprintf("%%%s%%", strings.tolower(pair[0])) value := pair[1] envmap[value] = append(envmap[value], key) } } return envmap }
返回给定值的键列表的函数:
func getenvkeysbyvalue(envmap map[string][]string, value string) ([]string, error) { keys, found := envmap[value] if !found { return nil, errors.new("no environment variable keys found for the value") } return keys, nil }
现在您可以在主函数中使用 getenvkeysbyvalue() 函数:
func main() { // create a map of environment variables and their keys envmap := createenvhashmap() // this value can be replaced with the result variable in your main() function value := "c:\\windows" // get environment variable keys by value keys, err := getenvkeysbyvalue(envmap, value) if err != nil { fmt.println("error:", err) return } fmt.println("environment variable keys:") for _, key := range keys { fmt.println(key) } }
输出:
Environment variable keys: %systemroot% %windir%
这样就不需要手动编写 switch case 语句了。
确保仅调用 createenvhashmap()
一次,然后多次调用 getenvkeysbyvalue(envmap, value)
以在 o(1) 时间内获取键列表。
以上是os.Getenv() 的反向函數或函式庫的詳細內容。更多資訊請關注PHP中文網其他相關文章!

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

AI Hentai Generator
免費產生 AI 無盡。

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

熱門話題

OpenSSL,作為廣泛應用於安全通信的開源庫,提供了加密算法、密鑰和證書管理等功能。然而,其歷史版本中存在一些已知安全漏洞,其中一些危害極大。本文將重點介紹Debian系統中OpenSSL的常見漏洞及應對措施。 DebianOpenSSL已知漏洞:OpenSSL曾出現過多個嚴重漏洞,例如:心臟出血漏洞(CVE-2014-0160):該漏洞影響OpenSSL1.0.1至1.0.1f以及1.0.2至1.0.2beta版本。攻擊者可利用此漏洞未經授權讀取服務器上的敏感信息,包括加密密鑰等。

Go語言中用於浮點數運算的庫介紹在Go語言(也稱為Golang)中,進行浮點數的加減乘除運算時,如何確保精度是�...

Go爬蟲Colly中的Queue線程問題探討在使用Go語言的Colly爬蟲庫時,開發者常常會遇到關於線程和請求隊列的問題。 �...

後端學習路徑:從前端轉型到後端的探索之旅作為一名從前端開發轉型的後端初學者,你已經有了nodejs的基礎,...

本文討論了GO編程中的GO FMT命令,該命令將代碼格式化以遵守官方樣式準則。它突出了GO FMT在維持代碼一致性,可讀性和降低樣式辯論方面的重要性。 FO的最佳實踐

在BeegoORM框架下,如何指定模型關聯的數據庫?許多Beego項目需要同時操作多個數據庫。當使用Beego...
