如何为接受 UINT 参数的函数分配一个负数
How can I assign a negative number to the function that accepts the UINT parameter
来自 meigk/pkcs11 包。
有什么方法可以在登录函数中将负值指定为 userType?
因为我正在使用的 HSM 模型支持除以下标准角色之外的另一种角色,我想使用该角色登录。
标准角色:
CKU_SO uint = 0
CKU_USER uint = 1
CKU_CONTEXT_SPECIFIC uint = 2
登录功能源码来自https://github.com/miekg/pkcs11/
func (c *Ctx) Login(sh SessionHandle, userType uint, pin string) error {
p := C.CString(pin)
defer C.free(unsafe.Pointer(p))
e := C.Login(c.ctx, C.CK_SESSION_HANDLE(sh), C.CK_USER_TYPE(userType), p, C.CK_ULONG(len(pin)))
return toError(e)
}
在 C# 中。我使用了 PKCS11Interop 包,它的登录功能也只接受 uint 参数作为 userType。但是可以通过使用 unchecked 关键字来完成。所以我可以在登录函数中没有错误地输入负值。
这是我在 C# 中使用 https://github.com/Pkcs11Interop
的示例代码
public enum SpecialRole
{
CU = -12345
}
session.Login(unchecked((CKU)SpecialRole.CU), Settings.CryptoUserPin);
那么,我该如何在 Go 中执行此操作?欢迎推荐。
如果参数类型为uint
,则只能传递assignable to the type uint
(as stated in Spec: Calls)的值。并且uint
的有效范围不包括负数。
您可以将负值转换为 uint
。将负数int
转为uint
,大致相当于int
的最大值减去绝对值加1。所以如果你其他的常量很小,这样不会造成碰撞.
例如:
func main() {
f(1)
f(math.MaxUint64+1 -10)
x := -10
f(uint(x))
}
func f(i uint) {
fmt.Println(i)
}
这将输出(在 Go Playground 上尝试):
1
18446744073709551606
18446744073709551606
来自 meigk/pkcs11 包。 有什么方法可以在登录函数中将负值指定为 userType? 因为我正在使用的 HSM 模型支持除以下标准角色之外的另一种角色,我想使用该角色登录。
标准角色:
CKU_SO uint = 0
CKU_USER uint = 1
CKU_CONTEXT_SPECIFIC uint = 2
登录功能源码来自https://github.com/miekg/pkcs11/
func (c *Ctx) Login(sh SessionHandle, userType uint, pin string) error {
p := C.CString(pin)
defer C.free(unsafe.Pointer(p))
e := C.Login(c.ctx, C.CK_SESSION_HANDLE(sh), C.CK_USER_TYPE(userType), p, C.CK_ULONG(len(pin)))
return toError(e)
}
在 C# 中。我使用了 PKCS11Interop 包,它的登录功能也只接受 uint 参数作为 userType。但是可以通过使用 unchecked 关键字来完成。所以我可以在登录函数中没有错误地输入负值。
这是我在 C# 中使用 https://github.com/Pkcs11Interop
的示例代码public enum SpecialRole
{
CU = -12345
}
session.Login(unchecked((CKU)SpecialRole.CU), Settings.CryptoUserPin);
那么,我该如何在 Go 中执行此操作?欢迎推荐。
如果参数类型为uint
,则只能传递assignable to the type uint
(as stated in Spec: Calls)的值。并且uint
的有效范围不包括负数。
您可以将负值转换为 uint
。将负数int
转为uint
,大致相当于int
的最大值减去绝对值加1。所以如果你其他的常量很小,这样不会造成碰撞.
例如:
func main() {
f(1)
f(math.MaxUint64+1 -10)
x := -10
f(uint(x))
}
func f(i uint) {
fmt.Println(i)
}
这将输出(在 Go Playground 上尝试):
1
18446744073709551606
18446744073709551606