如何将以下目标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);
答案 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
$