정수를 16 진수로, 16 진수를 정수로 변환
그래서 signal_data
Sybase 에서이 쿼리 ( 열이있는 곳) 가 작동 하지만 Microsoft SQL Server에서는 작동하지 않습니다.
HEXTOINT(SUBSTRING((INTTOHEX(signal_data)),5,2)) as Signal
Excel에도 있습니다 ( A1
값 이 포함 된 위치 ).
=HEX2DEC(LEFT(DEC2HEX(A1),LEN(DEC2HEX(A1))-2))
누구든지 SQL Server에서이 작업을 수행하는 방법을 알고 있습니까?
INT를 16 진수로 변환 :
SELECT CONVERT(VARBINARY(8), 16777215)
16 진수를 INT로 변환 :
SELECT CONVERT(INT, 0xFFFFFF)
업데이트 2015-03-16
위의 예에는 HEX 값이 정수 리터럴로 제공되는 경우에만 작동한다는 제한이 있습니다. 완전성을 위해 변환 할 값이 16 진수 문자열 (예 : varchar 열에 있음) 인 경우 다음을 사용합니다.
-- If the '0x' marker is present:
SELECT CONVERT(INT, CONVERT(VARBINARY, '0x1FFFFF', 1))
-- If the '0x' marker is NOT present:
SELECT CONVERT(INT, CONVERT(VARBINARY, '1FFFFF', 2))
참고 : 문자열에는 짝수의 16 진수가 포함되어야합니다. 홀수 자릿수는 오류를 생성합니다.
자세한 내용은 CAST 및 CONVERT (Transact-SQL) 의 "바이너리 스타일"섹션에서 확인할 수 있습니다 . SQL Server 2008 이상이 필요하다고 생각합니다.
실제로 내장 함수의 이름은 master.dbo.fn_varbintohexstr입니다.
예를 들면 다음과 같습니다.
SELECT 100, master.dbo.fn_varbintohexstr(100)
당신에게 준다
100 0x00000064
SQL Server는 Excel의 문자열 기반 DEC2HEX, HEX2DEC 함수에 해당합니다.
--Convert INT to hex string:
PRINT CONVERT(VARCHAR(8),CONVERT(VARBINARY(4), 16777215),2) --DEC2HEX
--Convert hex string to INT:
PRINT CONVERT(INT,CONVERT(VARBINARY(4),'00FFFFFF',2)) --HEX2DEC
int를 16 진수로 변환 :
SELECT FORMAT(512+255,'X')
SQL Server 2012 이상에서 사용 가능한 FORMAT 함수를 사용할 수 있습니다.
select FORMAT(10,'x2')
결과 :
0a
traditonal 4 비트 16 진수는 매우 직접적입니다. Hex String to Integer (값이 FHexString이라는 필드에 저장되어 있다고 가정) :
CONVERT(BIGINT,CONVERT(varbinary(4),
(SELECT master.dbo.fn_cdc_hexstrtobin(
LEFT(FMEID_ESN,8)
))
))
Integer to Hex String (값이 FInteger라는 필드에 저장되어 있다고 가정) :
(SELECT master.dbo.fn_varbintohexstr(CONVERT(varbinary,CONVERT(int,
FInteger
))))
특히 인텔 시스템에서 레지스터 공유를 유발하는 비트 크기를 사용하기 시작하면 인텔의 리틀 엔디안 특성으로 인해 레지스터의 높음 및 낮음, 왼쪽 및 권한이 서로 바뀝니다. 예를 들어 varbinary (3)를 사용할 때 6 자 16 진수에 대해 이야기하고 있습니다. 이 경우, 비트는 오른쪽에서 왼쪽 "54,32,10"으로 다음 인덱스로 쌍을 이룹니다. 인텔 시스템에서는 "76,54,32,10"이 예상됩니다. 8 개 중 6 개만 사용하므로 스왑을 직접 수행해야합니다. "76,54"는 귀하의 왼쪽으로, "32,10"은 귀하의 오른쪽으로 간주됩니다. 쉼표는 고점과 저점을 구분합니다. 인텔은 최고와 최저를 바꾼 다음 왼쪽과 권리를 바꿉니다. 그래서 전환을하려면 ... 한숨, 예를 들어 스스로 바꿔야합니다.
(SELECT master.dbo.fn_replvarbintoint(
CONVERT(varbinary(3),(SELECT master.dbo.fn_cdc_hexstrtobin(
--intel processors, registers are switched, so reverse them
----second half
RIGHT(FHex8,2)+ --0,1 (0 indexed)
LEFT(RIGHT(FHex8,4),2)+ -- 2,3 (oindex)
--first half
LEFT(RIGHT(FHex8,6),2) --4,5
)))
))
조금 복잡해서 8 자 16 진수 (varbinary (4))로 변환을 유지하려고합니다.
요약하면 이것은 귀하의 질문에 대한 답변입니다. 종합적으로.
다음은 정수 값을 16 진수 표현으로 varchar로 변환하는 SQL 서버용 함수입니다. 다른 데이터베이스 유형에 쉽게 적응할 수 있어야합니다.
예를 들면 :
SELECT dbo.ToHex(4095) --> FFF
SQL :
CREATE FUNCTION ToHex(@value int)
RETURNS varchar(50)
AS
BEGIN
DECLARE @seq char(16)
DECLARE @result varchar(50)
DECLARE @digit char(1)
SET @seq = '0123456789ABCDEF'
SET @result = SUBSTRING(@seq, (@value%16)+1, 1)
WHILE @value > 0
BEGIN
SET @digit = SUBSTRING(@seq, ((@value/16)%16)+1, 1)
SET @value = @value/16
IF @value <> 0 SET @result = @digit + @result
END
RETURN @result
END
GO
Declare @Dato xml
Set @Dato = Convert(xml, '<dato>FF</dato>')
Select Cast( rw.value( 'xs:hexBinary( text()[1])' , 'varbinary(max)' ) as int ) From @Dato.nodes('dato') as T(rw)
표현 master.dbo.fnbintohexstr(16777215)
으로 변환하는 데 사용 합니다 varchar
.
Maksym Kozlenko의 대답은 훌륭하며 숫자 값을 모든 코드 형식으로 인코딩하는 것을 처리하도록 약간 수정할 수 있습니다. 예를 들면 :
CREATE FUNCTION [dbo].[IntToAlpha](@Value int)
RETURNS varchar(30)
AS
BEGIN
DECLARE @CodeChars varchar(100)
SET @CodeChars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
DECLARE @CodeLength int = 26
DECLARE @Result varchar(30) = ''
DECLARE @Digit char(1)
SET @Result = SUBSTRING(@CodeChars, (@Value % @CodeLength) + 1, 1)
WHILE @Value > 0
BEGIN
SET @Digit = SUBSTRING(@CodeChars, ((@Value / @CodeLength) % @CodeLength) + 1, 1)
SET @Value = @Value / @CodeLength
IF @Value <> 0 SET @Result = @Digit + @Result
END
RETURN @Result
END
따라서 1 억 5 천만과 같은 큰 숫자는 6 자 (150,000,000 = "MQGJMU")가됩니다.
암호화 장치로 다른 시퀀스의 다른 문자를 사용할 수도 있습니다. 또는 코드 문자와 문자 길이를 전달하고 암호화를위한 솔팅 방법으로 사용합니다.
그리고 그 반대 :
CREATE FUNCTION [dbo].[AlphaToInt](@Value varchar(7))
RETURNS int
AS
BEGIN
DECLARE @CodeChars varchar(100)
SET @CodeChars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
DECLARE @CodeLength int = 26
DECLARE @Digit char(1)
DECLARE @Result int = 0
DECLARE @DigitValue int
DECLARE @Index int = 0
DECLARE @Reverse varchar(7)
SET @Reverse = REVERSE(@Value)
WHILE @Index < LEN(@Value)
BEGIN
SET @Digit = SUBSTRING(@Reverse, @Index + 1, 1)
SET @DigitValue = (CHARINDEX(@Digit, @CodeChars) - 1) * POWER(@CodeLength, @Index)
SET @Result = @Result + @DigitValue
SET @Index = @Index + 1
END
RETURN @Result
주어진:
declare @hexStr varchar(16), @intVal int
IntToHexStr :
select @hexStr = convert(varbinary, @intVal, 1)
HexStrToInt :
declare
@query varchar(100),
@parameters varchar(50)
select
@query = 'select @result = convert(int,' + @hb + ')',
@parameters = '@result int output'
exec master.dbo.Sp_executesql @query, @parameters, @intVal output
IIF(Fields!HIGHLIGHT_COLOUR.Value="","#FFFFFF","#" & hex(Fields!HIGHLIGHT_COLOUR.Value) & StrDup(6-LEN(hex(Fields!HIGHLIGHT_COLOUR.Value)),"0"))
나를 위해 글꼴 색상 표현으로 일하고 있습니까?
Hex 문자열을 INT로 변환하기 위해 과거에 이것을 사용했습니다. 실제로 모든 기본을 INT로 변환하도록 수정할 수 있습니다 (8 진수, 2 진수 등).
Declare @Str varchar(200)
Set @str = 'F000BE1A'
Declare @ndx int
Set @ndx = Len(@str)
Declare @RunningTotal BigInt
Set @RunningTotal = 0
While @ndx > 0
Begin
Declare @Exponent BigInt
Set @Exponent = Len(@Str) - @ndx
Set @RunningTotal = @RunningTotal +
Power(16 * 1.0, @Exponent) *
Case Substring(@str, @ndx, 1)
When '0' then 0
When '1' then 1
When '2' then 2
When '3' then 3
When '4' then 4
When '5' then 5
When '6' then 6
When '7' then 7
When '8' then 8
When '9' then 9
When 'A' then 10
When 'B' then 11
When 'C' then 12
When 'D' then 13
When 'E' then 14
When 'F' then 15
End
Set @ndx = @ndx - 1
End
Print @RunningTotal
다음은 dbo.HexToInt 및 dbo.IntToHex의 두 가지 함수입니다. 이러한 변환에 사용합니다.
if OBJECT_ID('dbo.HexToInt') is not null
drop function dbo.HexToInt
GO
create function dbo.HexToInt (@chars varchar(max))
returns int
begin
declare @char varchar(1), @len int, @i int, @r int, @tmp int, @pow int
set @chars = RTRIM(LTRIM(@chars))
set @len = LEN(@chars)
set @i = 1
set @r = 0
while @i <= @len
begin
set @pow = @len - @i
set @char = SUBSTRING(@chars, @i, 1)
if @char = '0'
set @tmp = 0
else if @char = '1'
set @tmp = 1
else if @char = '2'
set @tmp = 2
else if @char = '3'
set @tmp = 3
else if @char = '4'
set @tmp = 4
else if @char = '5'
set @tmp = 5
else if @char = '6'
set @tmp = 6
else if @char = '7'
set @tmp = 7
else if @char = '8'
set @tmp = 8
else if @char = '9'
set @tmp = 9
else if @char = 'A'
set @tmp = 10
else if @char = 'B'
set @tmp = 11
else if @char = 'C'
set @tmp = 12
else if @char = 'D'
set @tmp = 13
else if @char = 'E'
set @tmp = 14
else if @char = 'F'
set @tmp = 15
set @r = @r + @tmp * POWER(16,@pow)
set @i = @i + 1
end
return @r
end
그리고 두 번째 :
if OBJECT_ID('dbo.IntToHex') is not null
drop function dbo.IntToHex
GO
create function dbo.IntToHex (@val int)
returns varchar(max)
begin
declare @r varchar(max), @tmp int, @v1 int, @v2 int, @char varchar(1)
set @tmp = @val
set @r = ''
while 1=1
begin
set @v1 = @tmp / 16
set @v2 = @tmp % 16
if @v2 = 0
set @char = '0'
else if @v2 = 1
set @char = '1'
else if @v2 = 2
set @char = '2'
else if @v2 = 3
set @char = '3'
else if @v2 = 4
set @char = '4'
else if @v2 = 5
set @char = '5'
else if @v2 = 6
set @char = '6'
else if @v2 = 7
set @char = '7'
else if @v2 = 8
set @char = '8'
else if @v2 = 9
set @char = '9'
else if @v2 = 10
set @char = 'A'
else if @v2 = 11
set @char = 'B'
else if @v2 = 12
set @char = 'C'
else if @v2 = 13
set @char = 'D'
else if @v2 = 14
set @char = 'E'
else if @v2 = 15
set @char = 'F'
set @tmp = @v1
set @r = @char + @r
if @tmp = 0
break
end
return @r
end
Maksym Kozlenko는 멋진 솔루션을 가지고 있으며, 다른 사람들이 가까이 와서 그것의 잠재력을 잠금 해제 하지만 다음 문자의 순서를 정의 할 수 있음을 깨달았다 완전히 그리워 사용 그것의 베이스로 길이를 . 이것이 내가 그의 솔루션의 약간 수정 된 버전을 좋아하는 이유입니다. 16 진법 또는 17 진법 등에서 작동 할 수 있기 때문입니다.
For example, what if you wanted letters and numbers, but don't like I's for looking like 1's and O's for looking like 0's. You can define any sequence this way. Below is a form of a "Base 36" that skips the I and O to create a "modified base 34". Un-comment the hex line instead to run as hex.
declare @value int = 1234567890
DECLARE @seq varchar(100) = '0123456789ABCDEFGHJKLMNPQRSTUVWXYZ' -- modified base 34
--DECLARE @seq varchar(100) = '0123456789ABCDEF' -- hex
DECLARE @result varchar(50)
DECLARE @digit char(1)
DECLARE @baseSize int = len(@seq)
DECLARE @workingValue int = @value
SET @result = SUBSTRING(@seq, (@workingValue%@baseSize)+1, 1)
WHILE @workingValue > 0
BEGIN
SET @digit = SUBSTRING(@seq, ((@workingValue/@baseSize)%@baseSize)+1, 1)
SET @workingValue = @workingValue/@baseSize
IF @workingValue <> 0 SET @result = @digit + @result
END
select @value as Value, @baseSize as BaseSize, @result as Result
Value, BaseSize, Result
1234567890, 34, T5URAA
I also moved value over to a working value, and then work from the working value copy, as a personal preference.
Below is additional for reversing the transformation, for any sequence, with the base defined as the length of the sequence.
declare @value varchar(50) = 'T5URAA'
DECLARE @seq varchar(100) = '0123456789ABCDEFGHJKLMNPQRSTUVWXYZ' -- modified base 34
--DECLARE @seq varchar(100) = '0123456789ABCDEF' -- hex
DECLARE @result int = 0
DECLARE @digit char(1)
DECLARE @baseSize int = len(@seq)
DECLARE @workingValue varchar(50) = @value
DECLARE @PositionMultiplier int = 1
DECLARE @digitPositionInSequence int = 0
WHILE len(@workingValue) > 0
BEGIN
SET @digit = right(@workingValue,1)
SET @digitPositionInSequence = CHARINDEX(@digit,@seq)
SET @result = @result + ( (@digitPositionInSequence -1) * @PositionMultiplier)
--select @digit, @digitPositionInSequence, @PositionMultiplier, @result
SET @workingValue = left(@workingValue,len(@workingValue)-1)
SET @PositionMultiplier = @PositionMultiplier * @baseSize
END
select @value as Value, @baseSize as BaseSize, @result as Result
참고URL : https://stackoverflow.com/questions/703019/convert-integer-to-hex-and-hex-to-integer
'IT TIP' 카테고리의 다른 글
추적 출력을 콘솔로 리디렉션 (0) | 2020.10.22 |
---|---|
WPF의 크기 조정 가능한 창에서 최소화 및 최대화를 제거하려면 어떻게합니까? (0) | 2020.10.22 |
Collectors.toMap () keyMapper — 더 간결한 표현? (0) | 2020.10.22 |
"new String ()"도 변경 불가능합니까? (0) | 2020.10.22 |
안전 모드에서 mysql 삭제 (0) | 2020.10.22 |