Как конвертировать шестнадцатеричный в десятичный в SAS?
У меня есть: строка с шестнадцатеричными значениями каждые 4 позиции
00F701C101C900EC01E001D2
Я нуждаюсь:
Разделите эти значения из 4 в 4 позиции и преобразуйте их в десятичные числа следующим образом:
247, 449, 457, 480, 466
Моя колонка может иметь до 1200 шестнадцатеричных позиций
Вы можете мне помочь?
Tks!!!
2 ответа
Это работает:
data out;
hex = "00F701C101C900EC01E001D2";
do while(hex ne "");
valHex = substr(hex, 1, 4);
hex = substr(hex, 5);
valDec = input(valHex, hex4.);
output;
end;
run;
но вы захотите добавить больше проверки ошибок и т. д. для вашего реального решения.
Извините, я был быстро. Это синтаксис SQL-сервера, вероятно, не работает для вас, но вы можете получить представление...
Попробуйте это так:
DECLARE @YourString VARCHAR(100)='00F701C101C900EC01E001D2';
WITH Separated AS
(
SELECT CAST(LEFT(@YourString,4) AS VARCHAR(MAX)) AS SourceString
,CAST(SUBSTRING(@YourString,5,10000) AS VARCHAR(MAX)) AS RestString
UNION ALL
SELECT LEFT(RestString,4)
,SUBSTRING(RestString,5,10000)
FROM Separated
WHERE LEN(RestString)>=4
)
SELECT *
,CAST(sys.fn_cdc_hexstrtobin(SourceString) AS VARBINARY(2))
,CAST(CAST(sys.fn_cdc_hexstrtobin(SourceString) AS VARBINARY(2)) AS INT)
FROM Separated
Результат
+--------------+----------------------+--------------------+--------------------+
| SourceString | RestString | (Kein Spaltenname) | (Kein Spaltenname) |
+--------------+----------------------+--------------------+--------------------+
| 00F7 | 01C101C900EC01E001D2 | 0x00F7 | 247 |
+--------------+----------------------+--------------------+--------------------+
| 01C1 | 01C900EC01E001D2 | 0x01C1 | 449 |
+--------------+----------------------+--------------------+--------------------+
| 01C9 | 00EC01E001D2 | 0x01C9 | 457 |
+--------------+----------------------+--------------------+--------------------+
| 00EC | 01E001D2 | 0x00EC | 236 |
+--------------+----------------------+--------------------+--------------------+
| 01E0 | 01D2 | 0x01E0 | 480 |
+--------------+----------------------+--------------------+--------------------+
| 01D2 | | 0x01D2 | 466 |
+--------------+----------------------+--------------------+--------------------+