C# NET与sizeof

C# NET与sizeof,c#,.net,vb.net,sizeof,C#,.net,Vb.net,Sizeof,我正在将一些代码从C#转换为VB.NET。我用C写了下面一行# 从上面看,VB.NET似乎没有sizeof操作符。我知道存在一个marshall.SizeOf,但进一步声明返回的值可能与SizeOf的值不同 有人能帮忙吗?VB.NET中是否有等效语句 其他信息 我的目标是将密码转换为字节数组,然后对其进行散列,然后将其存储在数据库中或与以前存储的散列进行比较。但我不一定想要一个与我的具体情况相关的答案 Dim bytes(password.Length * xxx) As Byte System

我正在将一些代码从C#转换为VB.NET。我用C写了下面一行#

从上面看,VB.NET似乎没有
sizeof
操作符。我知道存在一个
marshall.SizeOf
,但进一步声明返回的值可能与
SizeOf
的值不同

有人能帮忙吗?VB.NET中是否有等效语句

其他信息

我的目标是将密码转换为字节数组,然后对其进行散列,然后将其存储在数据库中或与以前存储的散列进行比较。但我不一定想要一个与我的具体情况相关的答案

Dim bytes(password.Length * xxx) As Byte
System.Buffer.BlockCopy(password.ToCharArray(), 0, bytes, 0, bytes.Length)
Dim sha512 = System.Security.Cryptography.SHA512.Create()
Dim hash = sha512.ComputeHash(bytes)

' compare hash or stroe in database

VB中的“Len”操作符将执行此操作(但它对实例有效,因此您需要进行相应调整):


VB.NET的
Char
映射到.NET的
System.Char
,后者在中定义为16位Unicode字符。这意味着,
Char
有一个固定的大小(无论您在哪个平台上编译或运行代码),您实际上不需要
sizeof

因此,只需乘以
2

我正在对密码进行哈希运算,并关注stackoverflow.com/a/10380166/1113475

尽管票数很高,但最重要的答案是错误的。该答案的代码仍然使用编码(Unicode),因为所有字符串在.NET内部都是这样编码的。即使没有,编码仍然很重要,因为您需要能够在不同于加密字符串的系统上解密字符串,并获得有意义的结果。即使使用相同的系统进行加密/解密,像.NET Framework的Windows Update修补程序这样简单的操作也可能会破坏这一点。选择一种编码(如Unicode或UTF-8),只需调用其方法:


IIRC,
sizeof(char)
是一个编译时常量,等于2(字节)。创建
bytes
数组的目的是什么?可能相关:。确保您看到它使用了.Marshal.SizeOf(GetType(Char))@stakx,我已经看到了。最重要的答案是编码不重要。第二个答案(您链接到的答案)说编码确实很重要。我本以为答案不会涉及编码。在这种情况下,我可以安全地使用
Marshal.SizeOf
方法,而不是乘以2吗?@Kevin Brydon:Marshal.SizeOf听起来是一样的,但并不等同于C#SizeOf运算符-VB的'Len'运算符做SizeOf做的事情,但在实例上是这样的。-1!不要只是“乘以2”!我猜有些人不记得什么时候
Char
s可能是1字节。。。或者,当Win32出现时,一个
int
是2个字节,Word开发团队不得不花费数不清的时间来解决问题。。。是的,更改也会破坏很多其他人的代码:但这并不意味着更改不会发生。@AAT
char
s和
int
s在C中的大小始终相同,并且将始终相同,因为规范明确定义了它们。你可能会把它与C和C++混淆,其中代码< > char 或 int 仍然没有被规范定义。@斯维克好,毫无疑问,我在C和C++领域中的很多年都受到了制约…但我不相信PTB永远不会改变事情!而且,我从不相信神奇的数字。因此,至少,我会有一个
常数kSizeOfChar=2
或类似的东西,但我宁愿提取大小,也不愿查找ECMA 335。我不愿接受任何当前的答案,因为它们都是针对我的情况的。我期待着一个肯定/否定类型的答案,也许还有一个旁白来解决我的具体问题。我将稍等片刻,然后编辑您的帖子,在您对我的特定问题的回答上方添加“不,没有等价物”。@KevinBrydon这是同时问两个问题的危险,也是您不应该这样做的原因之一。
Dim bytes(password.Length * xxx) As Byte
System.Buffer.BlockCopy(password.ToCharArray(), 0, bytes, 0, bytes.Length)
Dim sha512 = System.Security.Cryptography.SHA512.Create()
Dim hash = sha512.ComputeHash(bytes)

' compare hash or stroe in database
Dim bytes = New Byte((someString.Length * Len(New Char)) - 1){}
Dim bytes = Encoding.Unicode.GetBytes(password)