【问题标题】:Convert uint16 array to string将 uint16 数组转换为字符串
【发布时间】:2018-07-29 21:13:35
【问题描述】:

我有一个来自 WinAPI PROCESSENTRY32.szExeFile 的 uint16 数组,我想将其转换为字符串。

这是我的 var 类型

var hello [260]uint16

现在我需要将 hello 转换为字符串。我该怎么做?

编辑

这是我尝试过的:

func szExeFileToString(ByteString [260]uint16) string {
    b := make([]byte, len(ByteString))

    for i, v := range ByteString {
        b[i] = byte(v)
    }

    return string(b)
}

但是,这会返回非常奇怪的字符串... result(该函数应将PROCESSENTRY32.szExeFile(->[260]uint16)类型中的Windows进程名称转换为字符串)

【问题讨论】:

  • 字符串应该采用什么格式?你试过什么?显示您的代码。你遇到了什么问题?
  • @Flimzy 问题已编辑。
  • 不要使用文本图像的链接——而是将文本直接复制并粘贴到问题中。
  • 不要把解决方案放在你的问题中——而是创造一个答案。
  • @Flimzy 是的,这仍然不是拒绝我的问题的理由

标签: go


【解决方案1】:

package windows

import "golang.org/x/sys/windows"

func UTF16ToString

func UTF16ToString(s []uint16) string

UTF16ToString 返回 UTF-16 序列 s 的 UTF-8 编码, 删除了终止 NUL。


使用windows.UTF16ToString。例如,

package main

import (
    "fmt"
    "golang.org/x/sys/windows"
)

func main() {
    var szExeFile [260]uint16
    szExeFile = [260]uint16{'e', 'x', 'e', 'F', 'i', 'l', 'e'}

    exeFile := windows.UTF16ToString(szExeFile[:])
    fmt.Println(exeFile)
}

输出:

exeFile

【讨论】:

    【解决方案2】:

    修复它。这是帮助遇到此问题的任何人将PROCESSENTRY32.szExeFile 结果转换为字符串的固定函数。

    注意:我也忘记使用 kernel32.NewProc("Process32FirstW")kernel32.NewProc("Process32NextW") 而不是 kernel32.NewProc("Process32First")

    func szExeFileToString(ByteString [260]uint16) string {
        var End = 0
    
        for i, _ := range ByteString {
            if ByteString[i] == 0 {
                End = i
                break
            }
        }
    
        return syscall.UTF16ToString(ByteString[:End])
    }
    

    【讨论】:

      猜你喜欢
      • 2019-10-13
      • 1970-01-01
      • 1970-01-01
      • 2014-05-17
      • 2020-06-27
      • 1970-01-01
      • 2018-03-20
      • 1970-01-01
      • 2017-02-14
      相关资源
      最近更新 更多