"7 + 3"과 같은 문자열을 계산하고 그 결과를 BigInteger 변수에 저장하려고하면 BigInteger와 마주 보는 문제가 발생하여 NumberFormat 예외가 발생합니다. 이것이 어떻게 작동 할 수 있는지에 대한 조언이 있습니까? 예 :For java.math.BigInteger
String ist="7+2";
java.math.BigInteger a = new java.math.BigInteger(ist);
"7 + 3"과 같은 문자열을 계산하고 그 결과를 BigInteger 변수에 저장하려고하면 BigInteger와 마주 보는 문제가 발생하여 NumberFormat 예외가 발생합니다. 이것이 어떻게 작동 할 수 있는지에 대한 조언이 있습니까? 예 :For java.math.BigInteger
String ist="7+2";
java.math.BigInteger a = new java.math.BigInteger(ist);
BigInteger는 표현식을 평가할 수 없습니다. 사실 임의의 산술 표현식에 대한 평가를 수행하는 Java의 해결책에 대해서는 잘 모르겠다. Groovy를 대신 사용해 보거나 표현식을 직접 파싱 할 수있다.
구문 분석을 고려하는 경우 가장 간단한 방법은 중급 표기법을 폴란드어 표기법으로 변환 한 다음 한 번에 한 명의 연산자로 폴란드어 양식을 평가하는 것입니다. shunting 야드 알고리즘을보세요.
BigInteger
은 new java.math.BigInteger("9")
과 같은 숫자 값을 전달할 때만 알 수 있습니다. 당신이 제공하는 것을 분석 할 수 없습니다.
diciu와 Peter Lang이 말한 것처럼 BigInteger는 표현식을 평가할 수 없습니다. 계산할 때 Integer와 같은 일부 프리미티브를 오버플로하는 숫자가 필요하면 두 개의 BigInteger를 만들고 결과를 평가할 수 있습니다. .
java.math.BigInteger a = new java.math.BigInteger("7").add(new java.math.BigInteger("2"));
당신이 정말로 문자열을 평가하려는 당신은 당신이 사용할 수있는 S-표현식을 사용 괜찮다면 Clojure의 :
Clojure 1.0.0-
user=> (def s "(+ 7 3)")
#'user/s
user=> (load-string s)
10
user=>
여기에 instructions for invoking Clojure from Java
당신이 평가하기 전에이 경로를주의 깊게 살피면 주입 공격에 노출 될 수 있습니다.
BTW Clojure의는 예를 들어 필요한 경우는 인 BigInteger를 사용하는 표현식을 평가할 때 :
user=> (def s "(+ 1 2)")
#'user/s
user=> (def r (load-string s))
#'user/r
user=> (. r getClass)
java.lang.Integer
user=> (def s "(+ 1000000000000000000000000 20000000000000000000000)")
#'user/s
user=> (def r (load-string s))
#'user/r
user=> (. r getClass)
java.math.BigInteger
user=>
이것이 어떤 종류의 주사 공격으로 이어질 수 있습니까? 이 문자열은 (+ 7 3)을 시스템 호출의 일종으로 대체 한 임의의 임의의 클라이언트에서 유래 한 것일 수 있습니다 –
분명히 당신이 경우 실제로 오랫동안 숫자 너무 큰 저장하는 BigInteger의 필요 여부를 확인하시기 바랍니다 그냥 표현 파서가 필요하고 BigInteger (String) 생성자를 착각했습니다. – MAK
@MAK - 표현 파서가 필요하며 일단 표현식이 파싱되고 평가되면 BigInteger에 저장하기에 충분히 길다는 것을 확신합니다. – ping