java中strtol的等效语句

时间:2015-01-25 17:52:05

标签: java c

如何将以下目标C语句写入java

unsigned char whole_byte;
char byte_chars[3] = {'\0','\0','\0'};
byte_chars[0] = ....;
byte_chars[1] = [....;
whole_byte = strtol(byte_chars, NULL, 16);

4 个答案:

答案 0 :(得分:1)

Java中不可能轻易实现,因为java总是按值传递,String对象是不可变的。这意味着它不可能将指针作为参数传递,该方法将在数字后面填充字符串。

<小时/> 在您的情况下,问题是如何在字符串的开头获取十六进制数。为此,您可以使用下面的第一种方法getLeadingInteger(string, 16)
这是线性时间解决方案:

public int getLeadingInteger(String inputString, int base) {
    char[] input = inputString.toLowerCase().toCharArray();
    boolean positive = input[0] != '-';
    int start = input[0] == '+' || input[0] == '-' ? 1 : 0;
    int end = start;
    for(; end < input.length; end++) {
        try {
            // check if still a digit in right base
            Integer.parseInt(Character.toString(input[end]), base);
        } catch(NumberFormatException e) {
            break;
        }
    }
    int length = end - start;
    int result = Integer.parseInt(new String(input, start, length), base);
    return result * (positive ? 1 : -1);
}

public String getStringAfterInteger(String inputString, int base) {
    char[] input = inputString.toLowerCase().toCharArray();
    int start = input[0] == '+' || input[0] == '-' ? 1 : 0;
    int end = start;
    for(; end < input.length; end++) {
        try {
            // check if still a digit in right base
            Integer.parseInt(Character.toString(input[end]), base);
        } catch(NumberFormatException e) {
            return inputString.substring(end, inputString.length());
        }
    }
    return ""; //if whole string is number
}

这两种方法都要求inputString至少为长度1,并且getLeadingInteger()要求inputString以有效数字开头,因为不清楚,应该返回什么号码


这是一个在O(n^2)中运行的更简单的解决方案:

public int getLeadingInteger(String input, int base) {
    int result = 0;
    for(int i = 1; i <= input.length(); i++) {
        try {
            result = Integer.parseInt(input.substring(0, i), base);
        } catch(NumberFormatException e) {
            break;
        }
    }
    return result;
}

public String getStringAfterInteger(String input, int base) {
    for(int i = 1; i <= input.length(); i++) {
        try {
            Integer.parseInt(input.substring(0, i), base); //test if integer
        } catch(NumberFormatException e) {
            return input.substring(i-1, input.length());
        }
    }
    //if the whole string is a number, the part after the number is empty
    return "";
}
在这两种情况下,

input.length()必须至少有一个。 假设Integer.parseInt()在线性时间内工作,两种方法都在O(n^2)时间运行。

答案 1 :(得分:1)

如果变量中有两个字符。

char ch0 = 'A';
char ch1 = '9';

转换为十六进制数字即可

int num = Integer.parseInt("" + ch0 + ch1, 16);

答案 2 :(得分:0)

在Java中,所有数字类型(包括byte)都是有符号的,因此您需要将String解析为int或short(尽管通常在Java中使用int更容易):< / p>

// Important:  Java strings do not end with '\0', so your char array's
// length should be 2.
String s = String.valueOf(byte_chars);
byte whole_byte = (byte) Integer.parseInt(s, 16);

答案 3 :(得分:0)

  

这是一个在O(n ^ 2)中运行的更简单的解决方案:

这个版本是C风格的strtol()的经典实现,它跟踪消耗的输入。此版本应在O(n)中运行。

public final class Scan
{
    public int offset;
    public String str;

    public Scan(String str)
    {
        this(str, 0);
    }

    public Scan(String str, int off)
    {
        this.str = str;
        this.offset = off;
    }

    public static int strtol(String s, int radix)
    {
        return new Scan(s).strtol(radix);
    }

    public int strtol(int radix)
    {
        int next, value;

        if (str.length() <= offset || radix < 2 || 36 < radix)
            return 0;

        int sign = 0;
        switch (str.charAt(offset)) {
        case '-': sign = -1; offset++; break;
        case '+': sign = +1; offset++; break;
        }

        for (value = 0, next = offset; next < str.length(); next++) {
            int digit = Character.digit(str.charAt(next), radix);
            if (digit < 0) break;
            value *= radix;
            value += digit;
        }

        if (offset < next)
            offset = next;
        else if (sign != 0)
            offset--;

        return sign == 0 ? value : value * sign;
    }
}

简单的测试示例:

public final class x
{
    public static void main(String args[])
    {
        Scan input = new Scan(args[0]);
        int value = input.strtol(10);
        System.out.println(value+" "+input.offset);
    }
}

因此,一旦编译,您应该得到以下结果:

$ java x ""
0 0
$ java x -
0 0
$ java x +
0 0
$ java x 1
1 1
$ java x +2
2 2
$ java x -3
-3 2
$ java x 123
123 3
$ java x +123
123 4
$ java x -123
-123 4
$ java x "7890, abc"
7890 4
$ java x "-7890, abc"
-7890 5
$