- Регистрация
- 08.09.2010
- Сообщения
- 577
- Благодарностей
- 41
- Баллы
- 28
допустим даже такой вариан )) но если цифры будут огромные что даже в калькулятор не влазиют ...перевести в 10-тиричные, сложить, перевести обратно
Недавно тема была, сюда число вообще любой длинны можно засунуть, только в коде умножение на сложение надо заменить.допустим даже такой вариан )) но если цифры будут огромные что даже в калькулятор не влазиют ...
а в 16 рично системе будет всего лишь 3b567c2314a545bb4
поэтому подходит вариант именно работы в 16 ричной системе ...
там немного не то, там же в 10 все .. (91389681247993671255432112000000 ) а как его потом перевести в 16 ричную систему там все калькуляторы афигели просто от значения )Недавно тема была, сюда число вообще любой длинны можно засунуть, только в коде умножение на сложение надо заменить.
Да в целом конвертацию из одной системы в другую проводить не так сложнотам немного не то, там же в 10 все .. (91389681247993671255432112000000 ) а как его потом перевести в 16 ричную систему там все калькуляторы афигели просто от значения )
Ну и на оборот как 16 ричное число перевести в 10 чтоб было полное число .. чтоб узнать от какого числа стартовать
int a = 6357452;
string result;
result = Convert.ToString(a, 16);
надо просто разделить число на разряды и при переводе умножать или делить на эти самые разряды.другое дело что у тебя число слишком длинное)
вот и я том же что число большое ... но перевести ег онадо .. в идеале было просто отработат ьсложение 2 шеснадцатиричных чисел и все ..Да в целом конвертацию из одной системы в другую проводить не так сложно
Вот пример кода для перевода в 16, другое дело что у тебя число слишком длинное)C#:int a = 6357452; string result; result = Convert.ToString(a, 16);
Так уже привели варианты )никто не знает как это реализовать ... сложение 16 ричных чисел?
интерисует вариант без перевода в десятичную .. именно сложение шестнадцатиричных значений надоТак уже привели варианты )
Я вопрос погуглил, по форумам по c# полазал, везде сначала в 10 переводят а потом складывают.интерисует вариант без перевода в десятичную .. именно сложение шестнадцатиричных значений надо
3b567c2314a545bb4+6f4d444ab
а как можно перевести 3b567c2314a545bb4 в десятичное значение чтоб получить полный ответ ... без -eЯ вопрос погуглил, по форумам по c# полазал, везде сначала в 10 переводят а потом складывают.
Никак, число очень большоеа как мо
а как можно перевести 3b567c2314a545bb4 в десятичное значение чтоб получить полный ответ ... без -e
Вы не указали, какой результат ожидаете.интерисует вариант без перевода в десятичную .. именно сложение шестнадцатиричных значений надо
3b567c2314a545bb4+6f4d444ab
Func<string, string> GetBinary = (hex) =>{
hex = hex.Replace(" ", string.Empty);
hex = hex.Replace("-", string.Empty);
hex = hex.Trim();
if((hex.Length % 2) > 0) hex = hex.PadLeft(hex.Length + 1, '0');
var bin = new StringBuilder();
for(var i = 0; i < hex.Length/2; i++){
bin.Append(Convert.ToString(Convert.ToByte(hex.Substring(i * 2, 2), 16), 2).PadLeft(8, '0'));
}
return bin.ToString();
};
Func<string, string, string> Sum = (x, y)=>{
int max = x.Length > y.Length ? x.Length : y.Length;
if(max%2>0) max++;
max += 2;
x = x.PadLeft(max, '0');
y = y.PadLeft(max, '0');
var list = new List<int>();
int z = 0;
for (int i = y.Length - 1; i >= 0; --i) {
int b1 = x[i] - '0';
int b2 = y[i] - '0';
list.Add((b1 ^ b2 ^ z) + '0');
z = (b1&z)|(b2&z)|(b1&b2);
}
if(z == 1) list.Add(z);
list.Reverse();
return new String(list.Select(m=>(char)m).ToArray());
};
Func<string, string> ConvertToByte = (s) =>{
int size = s.Length / 8;
var sb = new StringBuilder();
for(int i = 0; i < size; ++i) {
sb.Append( Convert.ToByte(s.Substring(8 * i, 8), 2).ToString("X2"));
}
return sb.ToString();
};
// Здесь начинается магия...
string line1 = "03-b5-67-c2-31-4a-54-5b-b4";
string line2 = "06 f4 d4 44 ab";
string a = GetBinary(line1);
project.SendInfoToLog(string.Format("{0} {1}", line1, a));
string b = GetBinary(line2);
project.SendInfoToLog(string.Format("{0} {1}", line2, b));
string sum = Sum(a,b);
string hash = ConvertToByte(sum);
project.SendInfoToLog(string.Format("{0} {1}", hash, sum));
ответ хотело сь бы тоже в 16 ричной системе получить ...Вы не указали, какой результат ожидаете.
Что должно получиться на выходе, после сложения этих двух строк?
Собственно, данную задачу я бы для себя решал примерно так:
Сначала выровнял бы размер строк, дополнив их нулями слева.
Дальше, то что получилось - перевел бы в двоичный код.
Дальше уже произвел бы суммирование каждого разряда.
Дальше результат преобразовал бы в байты.
Ну, и в конечном итоге - байты обратно вернул бы в виде хеш строки.
Таким образом, мне не важно было бы выходит за диапазон чисел или нет - работал бы с подобными данными просто как с обычными строками.
Пример набросал, возможно он как-то поможет.
Посмотреть вложение 95055C#:Func<string, string> GetBinary = (hex) =>{ hex = hex.Replace(" ", string.Empty); hex = hex.Replace("-", string.Empty); hex = hex.Trim(); if((hex.Length % 2) > 0) hex = hex.PadLeft(hex.Length + 1, '0'); var bin = new StringBuilder(); for(var i = 0; i < hex.Length/2; i++){ bin.Append(Convert.ToString(Convert.ToByte(hex.Substring(i * 2, 2), 16), 2).PadLeft(8, '0')); } return bin.ToString(); }; Func<string, string, string> Sum = (x, y)=>{ int max = x.Length > y.Length ? x.Length : y.Length; if(max%2>0) max++; max += 2; x = x.PadLeft(max, '0'); y = y.PadLeft(max, '0'); var list = new List<int>(); int z = 0; for (int i = y.Length - 1; i >= 0; --i) { int b1 = x[i] - '0'; int b2 = y[i] - '0'; list.Add((b1 ^ b2 ^ z) + '0'); z = (b1&z)|(b2&z)|(b1&b2); } if(z == 1) list.Add(z); list.Reverse(); return new String(list.Select(m=>(char)m).ToArray()); }; Func<string, string> ConvertToByte = (s) =>{ int size = s.Length / 8; var sb = new StringBuilder(); for(int i = 0; i < size; ++i) { sb.Append( Convert.ToByte(s.Substring(8 * i, 8), 2).ToString("X2")); } return sb.ToString(); }; // Здесь начинается магия... string line1 = "03-b5-67-c2-31-4a-54-5b-b4"; string line2 = "06 f4 d4 44 ab"; string a = GetBinary(line1); project.SendInfoToLog(string.Format("{0} {1}", line1, a)); string b = GetBinary(line2); project.SendInfoToLog(string.Format("{0} {1}", line2, b)); string sum = Sum(a,b); string hash = ConvertToByte(sum); project.SendInfoToLog(string.Format("{0} {1}", hash, sum));
P.S. Код рассматривать исключительно как пример, я где-то допустил ошибку в процессе перевода значений, из-за чего результат может быть не корректным. Идея была объяснить базовый принцип.
разве это не ответ ?ответ хотело сь бы тоже в 16 ричной системе получить ...
Конкретное значение указать нужно, так как онлайн калькуляторы обрезают и показывают не корректно.ответ хотело сь бы тоже в 16 ричной системе получить ...
В том сообщении в коде ошибка. Я не перепроверил что длина строки 0100010101 кратна 8. В итоге, получалось что перевод в байты работал со смещением, что и выдавало не корректный результат.
Func<string, string> GetBinary = (hex) =>{
hex = hex.Replace(" ", string.Empty);
hex = hex.Replace("-", string.Empty);
hex = hex.Trim();
if((hex.Length % 2) > 0) hex = hex.PadLeft(hex.Length + 1, '0');
var bin = new StringBuilder();
for(var i = 0; i < hex.Length/2; i++){
bin.Append(Convert.ToString(Convert.ToByte(hex.Substring(i * 2, 2), 16), 2).PadLeft(8, '0'));
}
return bin.ToString();
};
Func<string, string, string> Sum = (x, y)=>{
int max = x.Length > y.Length ? x.Length : y.Length;
if(max%2>0) max++;
max += 2;
x = x.PadLeft(max, '0');
y = y.PadLeft(max, '0');
var list = new List<int>();
int z = 0;
for (int i = y.Length - 1; i >= 0; --i) {
int b1 = x[i] - '0';
int b2 = y[i] - '0';
list.Add((b1 ^ b2 ^ z) + '0');
z = (b1&z)|(b2&z)|(b1&b2);
}
if(z == 1) list.Add(z);
list.Reverse();
string temp = new String(list.Select(m=>(char)m).ToArray());
if((temp.Length%8)>0) temp=temp.PadLeft((temp.Length/8+1)*8, '0');
return temp;
};
Func<string, string> ConvertToByte = (s) =>{
int size = s.Length / 8;
var sb = new StringBuilder();
for(int i = 0; i < size; ++i) {
sb.Append( Convert.ToByte(s.Substring(8 * i, 8), 2).ToString("X2"));
}
return sb.ToString();
};
// Здесь начинается магия...
string line1 = "03b567c2314a545bb4";
line1 = "fff";
string line2 = "06f4d444ab";
line2 = "aaa";
string a = GetBinary(line1);
project.SendInfoToLog(string.Format("{0} {1}", line1, a));
string b = GetBinary(line2);
project.SendInfoToLog(string.Format("{0} {1}", line2, b));
string sum = Sum(a,b);
string hash = ConvertToByte(sum);
project.SendInfoToLog(string.Format("{0} {1}", hash, sum));
BigInteger bi1 = BigInteger.Parse("3b567c2314a545bb4", NumberStyles.HexNumber);
BigInteger bi2 = BigInteger.Parse("6f4d444ab", NumberStyles.HexNumber);
BigInteger sum = BigInteger.Add(bi1, bi2);
Console.WriteLine("{0:x}", sum); //or sum.ToString("x")
Так из-за этого я и написал чтобы человек уточнил что именно ему нужно на выходе - чтобы понять какой вариант можно считать правильным.гугл
using System.Numerics;
using System.Globalization;
так тоже 3b567c2383f28a05fC#:BigInteger bi1 = BigInteger.Parse("3b567c2314a545bb4", NumberStyles.HexNumber); BigInteger bi2 = BigInteger.Parse("6f4d444ab", NumberStyles.HexNumber); BigInteger sum = BigInteger.Add(bi1, bi2); Console.WriteLine("{0:x}", sum); //or sum.ToString("x")
только вот при сложении "fff" и "aaa" выдает aa9, без 1 в начале, хотя онлайн калькуляторы выдают 1aa9
то да, я несколько онлайн калькуляторов глянул, там почти на всех разный результат был по 3b567c2314a545bb4+6f4d444abТак из-за этого я и написал чтобы человек уточнил что именно ему нужно на выходе - чтобы понять какой вариант можно считать правильным.
Я также разные поглядел, понял что они обрезают (переводят например в десятичную, складывают, возвращают результат, но сталкиваются с переполнением, из-за чего что-то да пропадает).то да, я несколько онлайн калькуляторов глянул, там почти на всех разный результат был по 3b567c2314a545bb4+6f4d444ab
и только на одном из всех был как у тебя или в том коде что я скинул
1AA9 это верный вариант сложения FFF +AAAЯ также разные поглядел, понял что они обрезают (переводят например в десятичную, складывают, возвращают результат, но сталкиваются с переполнением, из-за чего что-то да пропадает).
В конечном итоге взял бумажку, ручку и на листике сосчитал сумму, после чего уже сравнил с кодом.