Я пытаюсь написать код, который позволит мне распечатать значение поля данных CAN-сообщений в виде ряда шорт в шестнадцатеричной форме , Поля данных CAN-сообщений содержат 4 коротких сообщения, поэтому, например, я могу распечатать одно сообщение как «FFFF EEEE ABAB 2013».Как установить 32-й бит целого числа Java, не испортив его напечатанное строковое представление
Я могу кодировать 2 коротких сообщения CAN в целочисленном значении, и все работает нормально, пока 32-й бит целого не установлен. Поскольку Java использует знаковые целые числа, установка 32-го бита заставляет его печатать серию «f» s. Я хочу, чтобы целое число выполнялось как значение без знака, поэтому его печать не вызывает проблем.
Вот пример этого происходит не так:
(int value): 0x80000000
(string rep short 1): 0xffff8000
<crash>
А вот как это работает в любом другом случае:
(int value): 0x40000000
(string rep short 1): 0x4000
(string rep short 2): 0x0
код, где я пытаюсь представить данные CAN сообщений и где произошел сбой:
public String getFormattedData() {
String dataString = "";
for(String aShort : Utility.splitStringByWhitespace(getData())) {
try{
dataString += ("0000".substring(0, 4 - aShort.length()) + aShort) + " ";
} catch(Exception e) {
System.out.println(getData());
System.exit(1);
}
}
return dataString.toUpperCase();
}
В частности, авария происходит из-за того, что «f» ударяет по длине e короткое строковое представление до 8 символов, поэтому «4 - aShort.length()» приведет к отрицательному значению, которое является недопустимым.
Edit: Для тех, кто с просьбой, в данном случае это, как я использую целые числа для кодирования данных, прежде чем я преобразовать его в строковое представление:
public String convertToCANMessageData(PWMChannel channel) {
int channelVal = channel.getValue();
int entryDataHI = 0, entryDataLO = 0;
entryDataHI += channelVal << 24;
entryDataHI += smallData << 8;
entryDataHI += (largeData >> 8) & 0xFF;
entryDataLO += (largeData & 0xFF) << 24;
if(ramping) {
entryDataHI = entryDataHI | (1 << 16);
} else {
entryDataHI = entryDataHI & ~(1 << 16);
}
if(jumping) {
entryDataHI = entryDataHI | (1 << 17);
} else {
entryDataHI = entryDataHI & ~(1 << 17);
}
if(frequencySetting) {
entryDataHI = entryDataHI | (1 << 18);
} else {
entryDataHI = entryDataHI & ~(1 << 18);
}
return String.format("%x %x %x %x", entryDataHI >> 16, entryDataHI & 0xFFFF,
entryDataLO >> 16, entryDataLO & 0xFFFF);
}
Где вы конвертировать между числами и строками? Все, что я вижу, - это много обработки строк. – Joni
Как использовать длинный вместо int?Он достаточно велик, чтобы избежать проблем с символами, и вам нужно удалить только 0s –
@Joni, я обновил детали. – Tagc