将长十六进制字符串转换为不按预期工作的整数(在SQL中工作)

本文关键字:工作 整数 SQL 字符串 十六进制 转换 | 更新日期: 2023-09-27 18:17:38

我需要使用c#将十六进制字符串转换为整数。我已经尝试了所有关于SO的建议,包括这个和许多其他的。他们都投出相同或大致相同的……错误。Value was either too large or too small for an Int32(与Int64相同).

我可以在SQL Server 2008中使用以下代码获得所需的结果:

select convert(int, 0x1B1D3E1B22176145272C1631282D221D30)

然而这段c#代码

Int64.Parse("1B1D3E1B22176145272C1631282D221D30", NumberStyles.HexNumber)
Int32.Parse("1B1D3E1B22176145272C1631282D221D30", NumberStyles.HexNumber)

…产生上述错误。想法吗? ?解决方案?

UPDATE:上面的SQL代码产生以下整数:555949360. 对于我能找到的每条记录,sql转换都会产生一个唯一的Integer。所以新的问题(我猜)是……如何复制这个十六进制数据上的SQL转换函数的结果?

将长十六进制字符串转换为不按预期工作的整数(在SQL中工作)

而SQL Server没有错误,它没有给你正确的答案。它将十六进制字符串截断为低32位

select convert(int, 0x2D221D30) = 757210416
select convert(int, 0x1B1D3E1B22176145272C1631282D221D30) = 757210416

如果你把它改为bigint,你会得到不同的结果:

select convert(bigint, 0x2D221D30) = 757210416
select convert(bigint, 0x1B1D3E1B22176145272C1631282D221D30) = 3176780635782126896

号码太大了。当Int64.MaxValue为9,223,372,036,854,775,807时,约为9.2264939914744E+39。

尝试使用BigInteger.Parse方法

我在wolfram上试过,那是一个133位的数字。你可以尝试在c#

中使用BigInteger(Byte[])

这是二进制数,如果你想看它:1101100011101001111100001101100100010000101110110000101000101001001110010110000010110001100010010100000101101001000100001110100110000

您(也不是SQL Server)可以将34字节解码为4字节整数。十六进制字符串将数据的每个字节表示为两个字符,一个用于高位(4位),一个用于低位(4位)。

你可以使用我写的一个HexEncoding类来解码成字节,或者你自己写。

参见http://en.wikipedia.org/wiki/Hexidecimal