我是一个非常高尚,自学成才的java程序员,我试图在一个BigIntegers数组中拆分Biginteger,其长度为194(通过myBigInt.toByteArray.length计算),数组的每个元素都是长7个字节。我首先尝试将我的BigInteger翻译成一个字符串但是当它是一个字符串时我可以分成" char-length"大小而不是字节大小。 我已经阅读了有关范围的System.arraycopy()和arraycopy但是我不了解如何使用em,或者这些功能不适合我的情况。
实际上,我通过MyBigInt.toByteArray完成了BigInteger的byte []转换。 some1可以帮帮我吗?
以下是我必须做的一个例子:
我的BigInteger:123456789012345678901234567890分裂为让我们说7个字节的块:
MyBigInteger[0]=123467
MyBigInteger[1]=890123
MyBigInteger[2]=456789
等等...... MyBigInteger [0]长7个字节,第二个长,等等...
答案 0 :(得分:0)
我不确定你是否真的需要使用基于byte []的方法(我尝试了但它没有给出预期的结果),所以也许可以使用基于char的方法返回你的示例输出:
public static BigInteger[] splitIntoParts(BigInteger value, int partLength) {
// use the BigInteger value as string (might not work with negative values)
String valueStr = value.toString();
// calculate number of result parts (array length)
int partCount = valueStr.length() / partLength;
if (partCount * partLength < valueStr.length()) {
// as the partCount is cut (e.g. 13/5=2) we need an extra element then
partCount = partCount + 1;
}
// result data
BigInteger[] splitted = new BigInteger[partCount];
for (int i = 0; i < splitted.length; i++) {
// calculate end position
int endPos = (i + 1) * partLength;
// if the end position exceeds the string length, then use end position of string
if (endPos > valueStr.length()) {
endPos = valueStr.length();
}
// create the part using substring
String valuePart = valueStr.substring(i * partLength, endPos);
// and make a BigInteger with this string
splitted[i] = new BigInteger(valuePart);
}
// return result
return splitted;
}
编辑: 这是上面的代码,修改为使用字节数据,但我不确定它是否返回您期望的值。
public static BigInteger[] splitIntoParts(BigInteger value, int partLength) {
byte[] valueBytes = value.toByteArray();
// calculate number of result parts (array length)
int partCount = valueBytes.length / partLength;
if (partCount * partLength < valueBytes.length) {
// as the partCound is cut (e.g. 13/5=2) we need an extra element then
partCount = partCount + 1;
}
// result data
BigInteger[] splitted = new BigInteger[partCount];
for (int i = 0; i < splitted.length; i++) {
// calculate end position
int endPos = (i + 1) * partLength;
// if the end position exceeds the value length, then use end position
if (endPos > valueBytes.length) {
endPos = valueBytes.length;
}
// create a buffer for the part and fill it
byte[] valuePart = new byte[endPos - i * partLength];
System.arraycopy(valueBytes, i, valuePart, 0, valuePart.length);
// and make a BigInteger with this part
splitted[i] = new BigInteger(valuePart);
}
// return result
return splitted;
}