Java BigInteger ў байт масіва эквівалент у .NET

Я працую на інтэграцыі з партнёрам, які выкарыстоўвае Java ў BigInteger , каб згенераваць масіў байтаў ў якасці ключа для простага алгарытму шыфравання. Я спрабую знайсці эквівалентны код .NET без асаблівай ўдачы.

Код Java, яны выкарыстоўваюць гэта:

String keyString = "48B734DA47388C656913C9BF5146E186";
byte key[] = new BigInteger(keyString, 16).toByteArray();

што дае наступныя байт масіў:

[72, -73, 52, -38, 71, 56, -116, 101, 105, 19, -55, -65, 81, 70, -31, -122]

Гэта сам па сабе выклікае неспакой, паколькі байты s ў межах .NET ад 0-255, так што адмоўных значэнняў знаходзяцца па-за дыяпазону.

Бліжэйшы .NET код, які я прыдумаў гэта:

string keyString = "48B734DA47388C656913C9BF5146E186";
byte[] key = BigInteger.Parse(keyString, NumberStyles.HexNumber).ToByteArray();

што дае наступныя байт масіў:

[134, 225, 70, 81, 191, 201, 19, 105, 101, 140, 56, 71, 218, 52, 183, 72]

На дадзены момант, я думаў .NET эквівалент проста не ўяўляецца магчымым - асабліва з-за адмоўнага байт значэння.

Я з нецярпеннем чакаю, каб думкі кожнага.

3
Паспрабуйце дадання .Cast () ToArray() ;. пасля ToByteArray() . Павінна працаваць.
дададзена аўтар It'sNotALie., крыніца
Паспрабуйце дадання .Cast () ToArray() ;. пасля ToByteArray() . Павінна працаваць.
дададзена аўтар It'sNotALie., крыніца
rjygraham, Паглядзіце, што гэта друкуе вар s = string.join ( "", key.Reverse() Выберыце (х => (SByte) х) .ToArray ().);
дададзена аўтар I4V, крыніца
rjygraham, Паглядзіце, што гэта друкуе вар s = string.join ( "", key.Reverse() Выберыце (х => (SByte) х) .ToArray ().);
дададзена аўтар I4V, крыніца
rjygraham, Паглядзіце, што гэта друкуе вар s = string.join ( "", key.Reverse() Выберыце (х => (SByte) х) .ToArray ().);
дададзена аўтар I4V, крыніца
rjygraham, Паглядзіце, што гэта друкуе вар s = string.join ( "", key.Reverse() Выберыце (х => (SByte) х) .ToArray ().);
дададзена аўтар I4V, крыніца
@HighCore Першы масіў з'яўляецца Java байт масіў, які падпісаны значэння. Па-другое, .Net байт масіў, які не падпісаныя значэння.
дададзена аўтар NominSim, крыніца
@HighCore Першы масіў з'яўляецца Java байт масіў, які падпісаны значэння. Па-другое, .Net байт масіў, які не падпісаныя значэння.
дададзена аўтар NominSim, крыніца
@HighCore Першы масіў з'яўляецца Java байт масіў, які падпісаны значэння. Па-другое, .Net байт масіў, які не падпісаныя значэння.
дададзена аўтар NominSim, крыніца
@HighCore Першы масіў з'яўляецца Java байт масіў, які падпісаны значэння. Па-другое, .Net байт масіў, які не падпісаныя значэння.
дададзена аўтар NominSim, крыніца
<�Код>, які дае наступны масіў байтаў - Гэта не масіў байтаў. У любым выпадку, гэта System.SByte [] .
дададзена аўтар Federico Berasategui, крыніца
<�Код>, які дае наступны масіў байтаў - Гэта не масіў байтаў. У любым выпадку, гэта System.SByte [] .
дададзена аўтар Federico Berasategui, крыніца
<�Код>, які дае наступны масіў байтаў - Гэта не масіў байтаў. У любым выпадку, гэта System.SByte [] .
дададзена аўтар Federico Berasategui, крыніца
<�Код>, які дае наступны масіў байтаў - Гэта не масіў байтаў. У любым выпадку, гэта System.SByte [] .
дададзена аўтар Federico Berasategui, крыніца
OP, у вас ёсць якой-небудзь прычыне не выкарыстоўваць SByte замест байт ?
дададзена аўтар Mike Precup, крыніца
OP, у вас ёсць якой-небудзь прычыне не выкарыстоўваць SByte замест байт ?
дададзена аўтар Mike Precup, крыніца
OP, у вас ёсць якой-небудзь прычыне не выкарыстоўваць SByte замест байт ?
дададзена аўтар Mike Precup, крыніца

6 адказы

Выкарыстоўваючы метад I4V LINQ прапанаваў у каментарах вырашае яго спадручна.

  sbyte[] key = BigInteger.Parse(keyString, NumberStyles.HexNumber).ToByteArray().Reverse().Select(x => (sbyte)x).ToArray();

Гэта дапаможа вам масіў, які вы хочаце. .NET выкарыстоўвае беззнаковые байты па змаўчанні, у той час як Java выкарыстоўвае падпісаны байты па змаўчанні. Яны маюць такое ж уяўленне бітаў, таму, у залежнасці ад таго, што вы робіце з ім, ён не можа на самай справе важна, які з іх выкарыстоўваецца, але, калі вы хочаце сапраўды эквівалентны выхад у .NET, вы павінны будзеце выкарыстоўваць замест sbytes байты, а проста выкарыстоўваючы байты азначаюць розныя рэчы паміж гэтымі двума мовамі.

6
дададзена
Дзякуй, я зусім забыўся пра SByte ... не мог бачыць лес за дрэвамі, таму што я быў так засяроджаны на сінтаксіс Java.
дададзена аўтар rjygraham, крыніца

Выкарыстоўваючы метад I4V LINQ прапанаваў у каментарах вырашае яго спадручна.

  sbyte[] key = BigInteger.Parse(keyString, NumberStyles.HexNumber).ToByteArray().Reverse().Select(x => (sbyte)x).ToArray();

Гэта дапаможа вам масіў, які вы хочаце. .NET выкарыстоўвае беззнаковые байты па змаўчанні, у той час як Java выкарыстоўвае падпісаны байты па змаўчанні. Яны маюць такое ж уяўленне бітаў, таму, у залежнасці ад таго, што вы робіце з ім, ён не можа на самай справе важна, які з іх выкарыстоўваецца, але, калі вы хочаце сапраўды эквівалентны выхад у .NET, вы павінны будзеце выкарыстоўваць замест sbytes байты, а проста выкарыстоўваючы байты азначаюць розныя рэчы паміж гэтымі двума мовамі.

6
дададзена
Дзякуй, я зусім забыўся пра SByte ... не мог бачыць лес за дрэвамі, таму што я быў так засяроджаны на сінтаксіс Java.
дададзена аўтар rjygraham, крыніца

Падобна на тое, што вынік ад .Net аднаўляецца з выніку Java, але яны адны і тыя ж значэння. Байт .Net беззнаковым аднак, а не Java байт, які падпісваецца (змяшчае негатывы, як вы заўважылі). Вы можаце проста пераўтварыць вынік, які вы атрымалі ў падпісаных байтах (SByte) і можаце цалкам змяніць парадак, а таксама:

sbyte[] finalResult = (sbyte[])(Array)key.Reverse().ToArray();

Вынікі ў: [72, -73, 52, -38, 71, 56, -116, 101, 105, 19, -55, -65, 81, 70, -31, -122]

Варта адзначыць, што бітаў прадстаўлення будзе тое ж самае, так што калі вы выкарыстоўваеце яго ў якасці ключа для некаторага шыфравання і працы з ім на ўзроўні бітаў вы не можаце атрымаць фактычныя падпісаны байт (SByte), але гэта будзе хутчэй за ўсё, зрабіць гэта лягчэй візуалізаваць пераўтварэнне з Java ў .Net, калі вы робіце.

2
дададзена

Падобна на тое, што вынік ад .Net аднаўляецца з выніку Java, але яны адны і тыя ж значэння. Байт .Net беззнаковым аднак, а не Java байт, які падпісваецца (змяшчае негатывы, як вы заўважылі). Вы можаце проста пераўтварыць вынік, які вы атрымалі ў падпісаных байтах (SByte) і можаце цалкам змяніць парадак, а таксама:

sbyte[] finalResult = (sbyte[])(Array)key.Reverse().ToArray();

Вынікі ў: [72, -73, 52, -38, 71, 56, -116, 101, 105, 19, -55, -65, 81, 70, -31, -122]

Варта адзначыць, што бітаў прадстаўлення будзе тое ж самае, так што калі вы выкарыстоўваеце яго ў якасці ключа для некаторага шыфравання і працы з ім на ўзроўні бітаў вы не можаце атрымаць фактычныя падпісаны байт (SByte), але гэта будзе хутчэй за ўсё, зрабіць гэта лягчэй візуалізаваць пераўтварэнне з Java ў .Net, калі вы робіце.

2
дададзена

Калі я параўноўваю 2 выніку ад Java:

<�Код> [72, -73, 52, -38, 71, 56, -116, 101, 105, 19, -55, -65, 81, 70, -31, -122]

ад .Net

<�Код> [134, 225, 70, 81, 191, 201, 19, 105, 101, 140, 56, 71, 218, 52, 183, 72]

Я магу сказаць, што:

  1. Яны, здаецца, так - .Net толькі ў рэверс замовы (вынік ўнутранага прадстаўлення ў Java быўшы Big Endian)
  2. .
  3. У .Net выніку няма адмоўных лікаў.
  4. <�Літый> Параўноўваючы вынік у зваротным парадку, паказваюць, што -73 гэта 183 у .NET </літый>

Так што я думаю, што мы можам сказаць, што вынік аднолькавыя, але трэба праверыць, што з'яўляецца Парадак байтаў адны і тыя ж прыкметы, што і захоўваюцца.

Ці можаце вы паказаць код, раздрукаваць гэтыя вынікі?

2
дададзена
Я ўжо забыўся, што Java захоўвае рэчы ўнутры як вялікі Endian ...
дададзена аўтар NominSim, крыніца
парадак байт для замовы ў рэверс
дададзена аўтар Mzf, крыніца

Калі я параўноўваю 2 выніку ад Java:

<�Код> [72, -73, 52, -38, 71, 56, -116, 101, 105, 19, -55, -65, 81, 70, -31, -122]

ад .Net

<�Код> [134, 225, 70, 81, 191, 201, 19, 105, 101, 140, 56, 71, 218, 52, 183, 72]

Я магу сказаць, што:

  1. Яны, здаецца, так - .Net толькі ў рэверс замовы (вынік ўнутранага прадстаўлення ў Java быўшы Big Endian)
  2. .
  3. У .Net выніку няма адмоўных лікаў.
  4. <�Літый> Параўноўваючы вынік у зваротным парадку, паказваюць, што -73 гэта 183 у .NET </літый>

Так што я думаю, што мы можам сказаць, што вынік аднолькавыя, але трэба праверыць, што з'яўляецца Парадак байтаў адны і тыя ж прыкметы, што і захоўваюцца.

Ці можаце вы паказаць код, раздрукаваць гэтыя вынікі?

2
дададзена
Я ўжо забыўся, што Java захоўвае рэчы ўнутры як вялікі Endian ...
дададзена аўтар NominSim, крыніца
парадак байт для замовы ў рэверс
дададзена аўтар Mzf, крыніца