Go – 将原始字节字符串转换为 UUID

huangapple go评论109阅读模式
英文:

Go - Convert raw byte string into uuid

问题

我正在尝试将原始字节字符串转换为UUID。以下是我的程序:

案例1:

  1. package main
  2. import (
  3. "fmt"
  4. "strconv"
  5. "github.com/google/uuid"
  6. )
  7. func main() {
  8. s := `"04
    package main
  9. import (
  10. 	"fmt"
  11. 	"strconv"
  12. 	"github.com/google/uuid"
  13. )
  14. func main() {
  15. 	s := `"\220\254\0021\265\235O~\244\326\216\227c\245\002"`
  16. 	s2, err := strconv.Unquote(s)
  17. 	if err != nil {
  18. 		panic(err)
  19. 	}
  20. 	by := []byte(s2)
  21. 	u, err := uuid.FromBytes(by)
  22. 	if err != nil {
  23. 		panic(err)
  24. 	}
  25. 	fmt.Println(u.String())
  26. }
  27. 2155O~4667c5
    package main
  28. import (
  29. 	"fmt"
  30. 	"strconv"
  31. 	"github.com/google/uuid"
  32. )
  33. func main() {
  34. 	s := `"\220\254\0021\265\235O~\244\326\216\227c\245\002"`
  35. 	s2, err := strconv.Unquote(s)
  36. 	if err != nil {
  37. 		panic(err)
  38. 	}
  39. 	by := []byte(s2)
  40. 	u, err := uuid.FromBytes(by)
  41. 	if err != nil {
  42. 		panic(err)
  43. 	}
  44. 	fmt.Println(u.String())
  45. }
  46. 2"`
  47. s2, err := strconv.Unquote(s)
  48. if err != nil {
  49. panic(err)
  50. }
  51. by := []byte(s2)
  52. u, err := uuid.FromBytes(by)
  53. if err != nil {
  54. panic(err)
  55. }
  56. fmt.Println(u.String())
  57. }

输出:

  1. 90ac0231-b59d-4f7e-a4d6-8e229763a502

案例2:

  1. package main
  2. import (
  3. "fmt"
  4. "strconv"
  5. "github.com/google/uuid"
  6. )
  7. func main() {
  8. s := `"53\'1
    package main
  9. import (
  10. 	"fmt"
  11. 	"strconv"
  12. 	"github.com/google/uuid"
  13. )
  14. func main() {
  15. 	s := `"\235\273\'\021\003\261@\022\226\275o\265\322\002\211\263"`
  16. 	s2, err := strconv.Unquote(s)
  17. 	if err != nil {
  18. 		panic(err)
  19. 	}
  20. 	by := []byte(s2)
  21. 	u, err := uuid.FromBytes(by)
  22. 	if err != nil {
  23. 		panic(err)
  24. 	}
  25. 	fmt.Println(u.String())
  26. }
  27. 31@265o52
    package main
  28. import (
  29. 	"fmt"
  30. 	"strconv"
  31. 	"github.com/google/uuid"
  32. )
  33. func main() {
  34. 	s := `"\235\273\'\021\003\261@\022\226\275o\265\322\002\211\263"`
  35. 	s2, err := strconv.Unquote(s)
  36. 	if err != nil {
  37. 		panic(err)
  38. 	}
  39. 	by := []byte(s2)
  40. 	u, err := uuid.FromBytes(by)
  41. 	if err != nil {
  42. 		panic(err)
  43. 	}
  44. 	fmt.Println(u.String())
  45. }
  46. 213"`
  47. s2, err := strconv.Unquote(s)
  48. if err != nil {
  49. panic(err)
  50. }
  51. by := []byte(s2)
  52. u, err := uuid.FromBytes(by)
  53. if err != nil {
  54. panic(err)
  55. }
  56. fmt.Println(u.String())
  57. }

输出:

  1. panic: invalid syntax
  2. goroutine 1 [running]:
  3. main.main()
  4. /tmp/sandbox1756881518/prog.go:14 +0x149
  5. 程序退出。

以上程序可以使用字符串"\220\254\0021\265\235O~\244\326\216\227c\245\002"正常工作,但在将字符串"\235\273\'\021\003\261@\022\226\275o\265\322\002\211\263"转换为UUID时失败。如何将这些字符串转换为UUID?

英文:

I am trying to convert raw byte strings into UUIDs in my program as follows:

Case1:

  1. package main
  2. import (
  3. "fmt"
  4. "strconv"
  5. "github.com/google/uuid"
  6. )
  7. func main() {
  8. s := `"04
    package main
  9. import (
  10. "fmt"
  11. "strconv"
  12. "github.com/google/uuid"
  13. )
  14. func main() {
  15. s := `"\220\254\0021\265\235O~\244\326\216\"\227c\245\002"`
  16. s2, err := strconv.Unquote(s)
  17. if err != nil {
  18. panic(err)
  19. }
  20. by := []byte(s2)
  21. u, err := uuid.FromBytes(by)
  22. if err != nil {
  23. panic(err)
  24. }
  25. fmt.Println(u.String())
  26. }
  27. 2155O~466\"7c5
    package main
  28. import (
  29. "fmt"
  30. "strconv"
  31. "github.com/google/uuid"
  32. )
  33. func main() {
  34. s := `"\220\254\0021\265\235O~\244\326\216\"\227c\245\002"`
  35. s2, err := strconv.Unquote(s)
  36. if err != nil {
  37. panic(err)
  38. }
  39. by := []byte(s2)
  40. u, err := uuid.FromBytes(by)
  41. if err != nil {
  42. panic(err)
  43. }
  44. fmt.Println(u.String())
  45. }
  46. 2"`
  47. s2, err := strconv.Unquote(s)
  48. if err != nil {
  49. panic(err)
  50. }
  51. by := []byte(s2)
  52. u, err := uuid.FromBytes(by)
  53. if err != nil {
  54. panic(err)
  55. }
  56. fmt.Println(u.String())
  57. }

output:

  1. 90ac0231-b59d-4f7e-a4d6-8e229763a502

Case2:

  1. package main
  2. import (
  3. "fmt"
  4. "strconv"
  5. "github.com/google/uuid"
  6. )
  7. func main() {
  8. s := `"53\'1
    package main
  9. import (
  10. "fmt"
  11. "strconv"
  12. "github.com/google/uuid"
  13. )
  14. func main() {
  15. s := `"\235\273\'\021\003\261@\022\226\275o\265\322\002\211\263"`
  16. s2, err := strconv.Unquote(s)
  17. if err != nil {
  18. panic(err)
  19. }
  20. by := []byte(s2)
  21. u, err := uuid.FromBytes(by)
  22. if err != nil {
  23. panic(err)
  24. }
  25. fmt.Println(u.String())
  26. }
  27. 31@265o52
    package main
  28. import (
  29. "fmt"
  30. "strconv"
  31. "github.com/google/uuid"
  32. )
  33. func main() {
  34. s := `"\235\273\'\021\003\261@\022\226\275o\265\322\002\211\263"`
  35. s2, err := strconv.Unquote(s)
  36. if err != nil {
  37. panic(err)
  38. }
  39. by := []byte(s2)
  40. u, err := uuid.FromBytes(by)
  41. if err != nil {
  42. panic(err)
  43. }
  44. fmt.Println(u.String())
  45. }
  46. 213"`
  47. s2, err := strconv.Unquote(s)
  48. if err != nil {
  49. panic(err)
  50. }
  51. by := []byte(s2)
  52. u, err := uuid.FromBytes(by)
  53. if err != nil {
  54. panic(err)
  55. }
  56. fmt.Println(u.String())
  57. }

output:

  1. panic: invalid syntax
  2. goroutine 1 [running]:
  3. main.main()
  4. /tmp/sandbox1756881518/prog.go:14 +0x149
  5. Program exited.

The above program is working with string "\220\254\0021\265\235O~\244\326\216\"\227c\245\002" but fails at converting string "\235\273\'\021\003\261@\022\226\275o\265\322\002\211\263" into uuid. How can I convert these strings into UUIDs?

答案1

得分: 3

如果因为\'而失败。当使用反引号时,所有的反斜杠都是字面上的反斜杠,而不是转义序列,所以你传递的是原始的反斜杠\,后面跟着单引号'strconv.Unquote。这导致了无效的语法。这里有两种解决方法:

第一种

只需将这行代码替换为:

  1. s := `"53'1
    s := `"\235\273'\021\003\261@\022\226\275o\265\322\002\211\263"`
  2. 31@265o52
    s := `"\235\273'\021\003\261@\022\226\275o\265\322\002\211\263"`
  3. 213"`

而不是:

  1. s := `"53\'1
    s := `"\235\273\'\021\003\261@\022\226\275o\265\322\002\211\263"`
  2. 31@265o52
    s := `"\235\273\'\021\003\261@\022\226\275o\265\322\002\211\263"`
  3. 213"`

所以这里是'而不是\'。但是如果你需要以编程方式转换字符串,请使用第二种方法。

第二种

导入"strings"

  1. import (
  2. "fmt"
  3. "strconv"
  4. "strings"
  5. "github.com/google/uuid"
  6. )

并将\'替换为'

  1. s = strings.ReplaceAll(s, `\'`, `'`)

所以完整的代码现在看起来像这样:

  1. package main
  2. import (
  3. "fmt"
  4. "strconv"
  5. "strings"
  6. "github.com/google/uuid"
  7. )
  8. func main() {
  9. s := `"53\'1
    package main
  10. import (
  11.     "fmt"
  12.     "strconv"
  13.     "strings"
  14.     "github.com/google/uuid"
  15. )
  16. func main() {
  17.     s := `"\235\273\'\021\003\261@\022\226\275o\265\322\002\211\263"`
  18.     s = strings.ReplaceAll(s, `\'`, `'`)
  19.     s2, err := strconv.Unquote(s)
  20.     if err != nil {
  21.         fmt.Println(err)
  22.     }
  23.     by := []byte(s2)
  24.     u, err := uuid.FromBytes(by)
  25.     if err != nil {
  26.         fmt.Println(err)
  27.     }
  28.     fmt.Println(u.String())
  29. }
  30. 31@265o52
    package main
  31. import (
  32.     "fmt"
  33.     "strconv"
  34.     "strings"
  35.     "github.com/google/uuid"
  36. )
  37. func main() {
  38.     s := `"\235\273\'\021\003\261@\022\226\275o\265\322\002\211\263"`
  39.     s = strings.ReplaceAll(s, `\'`, `'`)
  40.     s2, err := strconv.Unquote(s)
  41.     if err != nil {
  42.         fmt.Println(err)
  43.     }
  44.     by := []byte(s2)
  45.     u, err := uuid.FromBytes(by)
  46.     if err != nil {
  47.         fmt.Println(err)
  48.     }
  49.     fmt.Println(u.String())
  50. }
  51. 213"`
  52. s = strings.ReplaceAll(s, `\'`, `'`)
  53. s2, err := strconv.Unquote(s)
  54. if err != nil {
  55. fmt.Println(err)
  56. }
  57. by := []byte(s2)
  58. u, err := uuid.FromBytes(by)
  59. if err != nil {
  60. fmt.Println(err)
  61. }
  62. fmt.Println(u.String())
  63. }
英文:

If fails because of \'. When using backticks, all backslashes are literally backslashes and not escape sequences, so you are passing raw backslash \, followed by single quote ' to the strconv.Unquote. It causes invalid syntax. There are two workarounds here:

First

Just replace this line:

  1. s := `"53\'1
    s := `"\235\273\'\021\003\261@\022\226\275o\265\322\002\211\263"`
  2. 31@265o52
    s := `"\235\273\'\021\003\261@\022\226\275o\265\322\002\211\263"`
  3. 213"`

with this:

  1. s := `"53'1
    s := `"\235\273'\021\003\261@\022\226\275o\265\322\002\211\263"`
  2. 31@265o52
    s := `"\235\273'\021\003\261@\022\226\275o\265\322\002\211\263"`
  3. 213"`

So there is ' not \'. But if you need to programmatically convert the string, use the second approach.

Second

Import "strings":

  1. import (
  2. "fmt"
  3. "strconv"
  4. "strings"
  5. "github.com/google/uuid"
  6. )

And replace \' with ':

  1. s = strings.ReplaceAll(s, `\'`, `'`)

So the full code looks like this now:

  1. package main
  2. import (
  3. "fmt"
  4. "strconv"
  5. "strings"
  6. "github.com/google/uuid"
  7. )
  8. func main() {
  9. s := `"53\'1
    package main
  10. import (
  11. "fmt"
  12. "strconv"
  13. "strings"
  14. "github.com/google/uuid"
  15. )
  16. func main() {
  17. s := `"\235\273\'\021\003\261@\022\226\275o\265\322\002\211\263"`
  18. s = strings.ReplaceAll(s, `\'`, `'`)
  19. s2, err := strconv.Unquote(s)
  20. if err != nil {
  21. fmt.Println(err)
  22. }
  23. by := []byte(s2)
  24. u, err := uuid.FromBytes(by)
  25. if err != nil {
  26. fmt.Println(err)
  27. }
  28. fmt.Println(u.String())
  29. }
  30. 31@265o52
    package main
  31. import (
  32. "fmt"
  33. "strconv"
  34. "strings"
  35. "github.com/google/uuid"
  36. )
  37. func main() {
  38. s := `"\235\273\'\021\003\261@\022\226\275o\265\322\002\211\263"`
  39. s = strings.ReplaceAll(s, `\'`, `'`)
  40. s2, err := strconv.Unquote(s)
  41. if err != nil {
  42. fmt.Println(err)
  43. }
  44. by := []byte(s2)
  45. u, err := uuid.FromBytes(by)
  46. if err != nil {
  47. fmt.Println(err)
  48. }
  49. fmt.Println(u.String())
  50. }
  51. 213"`
  52. s = strings.ReplaceAll(s, `\'`, `'`)
  53. s2, err := strconv.Unquote(s)
  54. if err != nil {
  55. fmt.Println(err)
  56. }
  57. by := []byte(s2)
  58. u, err := uuid.FromBytes(by)
  59. if err != nil {
  60. fmt.Println(err)
  61. }
  62. fmt.Println(u.String())
  63. }

huangapple
  • 本文由 发表于 2022年6月11日 14:24:03
  • 转载请务必保留本文链接:https://go.coder-hub.com/72582188.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定