将BigInteger拆分为预定义大小的块

时间:2015-02-14 16:02:38

标签: split bytearray biginteger

我是一个非常高尚,自学成才的java程序员,我试图在一个BigIntegers数组中拆分Biginteger,其长度为194(通过myBigInt.toByteArray.length计算),数组的每个元素都是长7个字节。我首先尝试将我的BigInteger翻译成一个字符串但是当它是一个字符串时我可以分成" char-length"大小而不是字节大小。 我已经阅读了有关范围的System.arraycopy()和arraycopy但是我不了解如何使用em,或者这些功能不适合我的情况。

实际上,我通过My​​BigInt.toByteArray完成了BigInteger的byte []转换。 some1可以帮帮我吗?

以下是我必须做的一个例子:

我的BigInteger:123456789012345678901234567890分裂为让我们说7个字节的块:

MyBigInteger[0]=123467
MyBigInteger[1]=890123
MyBigInteger[2]=456789

等等...... MyBigInteger [0]长7个字节,第二个长,等等...

1 个答案:

答案 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;
}