c # — преобразование строки в гекса с 21 символом

У меня есть сервис для интеграции с другим приложением, и он принимает только 21 гекса-символ. Мне нужно передать и получить строку с 11 десятичными символами, например: String s = "0101230154V";

Я хотел бы знать, как я могу использовать операции сдвига для преобразования его в биты и передачи, потому что я не могу преобразовать свою десятичную строку в гекса, потому что это приведет к 22 гекса-символам. Я пытался с кодом ниже. Я думаю, что все в порядке преобразования в гекса, но когда я попытался преобразовать обратно в десятичную запись, это не работает, дать мне другие значения. Программисты C #, C ++ и Java, я думаю, могли бы помочь мне.

int n = 99;  // 2^6 bits to use 99
int k = 999; // 2^9 bits to use 999

int bits = (n << 6) | (k << 9 << 6); // I'm not sure if it is ok to convert and use with hexa

var hexa = bits.ToString("X"); // I will transmit this hexa to a web service

А в другом проекте у меня есть служба Windows для чтения гекса из веб-службы. Я могу читать хорошо, но я не знаю, как преобразовать обратно значение гекса и принять n а также k значения, для образца:

string hexa = GetFromWebService(); // get from the value from the web service here, its fine

// I will recieve the hexa and get the number in bits
int received = Int32.Parse(hexa, System.Globalization.NumberStyles.HexNumber);

// here I need to discover the N and K values... how?

Как открыть n а также k ценности?

Окончательное решение

long v = 123456789456;
string h = v.ToString("X");

// trasmit h value

var data = long.Parse(hexaValueFromService, System.Globalization.NumberStyles.HexNumber);

благодарю вас

2

Решение

Я не знаю, есть ли опечатка, когда вы говорите «11 десятичных символов» или нет, потому что последний символ явно не является десятичной цифрой.

Если это настоящая опечатка. Максимальное значение 11 десятичных символов составляет 99 999 999 999, что соответствует 64-битному целому числу. Таким образом, вы можете преобразовать строку в int64 (которая занимает всего 16 шестнадцатеричных символов), заполняя 0 байт, если это необходимо, а затем передать другой сервис.

На случай, если это не опечатка. Затем вы все равно можете преобразовать первые 10 десятичных цифр в int64, а затем передать как int64, так и оставшийся символ, требуется только 18 шестнадцатеричных символов.

Другое решение, если вы не хотите конвертировать в двоичный файл, плотно упакованный десятичный (DPD) хороший выбор Он упаковывает 3 десятичных знака в 10 бит. Таким образом, 10 цифр нужно 34 бита, что занимает 9 шестнадцатеричных цифр. Это работает напрямую с десятичной дробью и не требует преобразования в двоичную систему, поэтому не только занимает меньше места, но и очень быстро конвертирует туда-сюда. Если вам не нужно делать арифметику по значению, это, возможно, лучший выбор

1

Другие решения

Символ ASCII занимает один байт или 8 бит.
Символ Unicode занимает два байта или 16 бит.
Следовательно, эта строка из 11 символов будет занимать 11 или 22 байта в зависимости от CharacterSet.
Попробуйте установить CharacterSet в ASCII, и он будет работать.
При обычной печати два шестнадцатеричных символа хранят ОДИН байт. Следовательно, ваш сервис имеет максимум 90 битов (10,5 байт)

1

Можете ли вы убедиться, что символ не появится в первых 2 цифрах? если это так, то вы можете поставить целое число из первых 2 цифр в k.

если вы оставили сдвиг для подавления начальных нулей во время прохождения, как только вы его получили, вы снова получаете правый сдвиг, чтобы получить исходное число, а не анализировать Integer. например:
если вы делаете это:

(n равно 6 битам, а k равно 9 битам), поэтому вы хотите объединить их в биты (15 битов, 16-й бит является знаковым битом, поэтому использовать его не буду)

int bits =   (k << 6) | n

когда вы получаете, вы должны сделать это, чтобы получить значения:

n = (bits & 0x3F)     // gets rid of k in the first part 0x3F means '0000000000111111'
k = (bits >> 6)       // gets rid of n at the bottom part
1
По вопросам рекламы [email protected]