2 bayt (2'nin tamamlayıcısı) Java kodundaki bir int'ye dönüştürmem gerekiyor. nasıl yaparım? her durumdaJava'da int için baytları dönüştürme
toInt(byte hb, byte lb) { }
2 bayt (2'nin tamamlayıcısı) Java kodundaki bir int'ye dönüştürmem gerekiyor. nasıl yaparım? her durumdaJava'da int için baytları dönüştürme
toInt(byte hb, byte lb) { }
return ((int)hb << 8) | ((int)lb & 0xFF);
Doğru operasyon öğrenci için bir egzersiz olarak bırakılmıştır. Eğer çok fazla veri deşifre eğer Bu sınıf yararlı olabilir
public int toInt(byte hb, byte lb) {
ByteBuffer bb = ByteBuffer.wrap(new byte[] {hb, lb});
return bb.getShort(); // Implicitly widened to an int per JVM spec.
}
:
Bu oyuncular hem yedekli. –
Geçerli nokta, bazen açık olması daha nettir. –
Bu çözümün yalnızca imzalanmış kısa tamsayı temsiliyle çalıştığına ve bağlantı noktalarının imzasız bir biçimde temsil edildiği TCP başlıklarının kodunu çözmek için uygun olmayacağı belirtilmelidir. –
public int toInt(byte hb, byte lb)
{
return ((int)hb)<<8 + lb;
}
bu cevap teatrus ile aynı mıdır? – user121196
no, lb negatif olduğunda yanlış yanıtla gelir. – ILMTitan
Yanıtı düzenledikten sonra, çözüm << operatörünün etrafına parantez eklemek, yakında onaylanacağını umuyoruz ve diğerlerinin de bu snippet'i kullanan kodun hata ayıklaması için bir gün harcamamaları gerekiyor :) –
Ayrıca ByteBuffer sınıfını kullanabilirsiniz.
Ancak iki bayt 2 saniyede ise iltifat, bu hb ilk bitini işaret bit yapmaz mı? Yani yeni byte [] {a, b, c, d} 'a = hb & 0x80; b = 0; c = hb & 0x7F; d = lb; '? Burada üssü olabilirim. – corsiKa
İyi bir nokta, hb'nin ilk bitinin "a" nın sol tarafına çekilmesi gerekiyor, bu yüzden benim çözümüm muhtemelen aradığı şey değil. Sadece ByteBuffer sınıfını işaret etmek istedim ... – maerics
'getIho' yerine' getIs' kullanın. Sonuç olarak "kısa" kelimesini bir "int" a dönüştürdüğünüzde, doğru sonucu vererek işaret genişletilir. – finnw
Kullanımı:
public class Test {
public static void main(String[] args) {
byte[] b = new byte[] { -83, 0, 0, 0 };
int i = GattUtils.getIntValue(b, GattUtils.FORMAT_UINT32, 0);
System.out.println(i); //will print 173
}
public class GattUtils {
public static final long leastSigBits = 0x800000805f9b34fbL;
public static final int FIRST_BITMASK = 0x01;
public static final int SECOND_BITMASK = FIRST_BITMASK << 1;
public static final int THIRD_BITMASK = FIRST_BITMASK << 2;
public static final int FOURTH_BITMASK = FIRST_BITMASK << 3;
public static final int FIFTH_BITMASK = FIRST_BITMASK << 4;
public static final int SIXTH_BITMASK = FIRST_BITMASK << 5;
public static final int SEVENTH_BITMASK = FIRST_BITMASK << 6;
public static final int EIGTH_BITMASK = FIRST_BITMASK << 7;
public static final int FORMAT_UINT8 = 17;
public static final int FORMAT_UINT16 = 18;
public static final int FORMAT_UINT32 = 20;
public static final int FORMAT_SINT8 = 33;
public static final int FORMAT_SINT16 = 34;
public static final int FORMAT_SINT32 = 36;
public static final int FORMAT_SFLOAT = 50;
public static final int FORMAT_FLOAT = 52;
public static UUID toUuid(String uuidString) {
return UUID.fromString(uuidString);
}
public static UUID toUuid(long assignedNumber) {
return new UUID((assignedNumber << 32) | 0x1000, leastSigBits);
}
public static String toUuid128(long assignedNumber) {
return toUuid(assignedNumber).toString();
}
public static String toUuid16(int assignedNumber) {
return Integer.toHexString(assignedNumber);
}
public static Integer getIntValue(byte[] value, int format, int position) {
if (value == null)
return null;
if (position + (format & 0xF) > value.length)
return null;
switch (format) {
case FORMAT_UINT8:
return Integer.valueOf(value[position] & 0xFF);
case FORMAT_UINT16:
return Integer.valueOf(add(value[position], value[(position + 1)]));
case FORMAT_UINT32:
return Integer.valueOf(add(value[position], value[(position + 1)], value[(position + 2)], value[(position + 3)]));
case FORMAT_SINT8:
return Integer.valueOf(signed(value[position] & 0xFF, 8));
case FORMAT_SINT16:
return Integer.valueOf(signed(add(value[position], value[(position + 1)]), 16));
case FORMAT_SINT32:
return Integer.valueOf(signed(add(value[position], value[(position + 1)], value[(position + 2)], value[(position + 3)]), 32));
}
return null;
}
public static Float getFloatValue(byte[] value, int format, int position) {
if (value == null)
return null;
if (position + (format & 0xF) > value.length)
return null;
int i;
int mantissa;
int exponent;
switch (format) {
case FORMAT_SFLOAT:
i = value[(position + 1)];
position = value[position];
mantissa = signed((position & 0xFF) + ((i & 0xFF & 0xF) << 8), 12);
exponent = signed((i & 0xFF) >> 4, 4);
return Float.valueOf((float) (mantissa * Math.pow(10.0D, exponent)));
case FORMAT_FLOAT:
exponent = value[(position + 3)];
mantissa = value[(position + 2)];
i = value[(position + 1)];
position = value[position];
return Float.valueOf((float) ((format = signed((position & 0xFF) + ((i & 0xFF) << 8) + ((mantissa & 0xFF) << 16), 24)) * Math.pow(10.0D, exponent)));
}
return null;
}
public static String getStringValue(byte[] value, int position) {
if (value == null)
return null;
if (position > value.length)
return null;
byte[] arrayOfByte = new byte[value.length - position];
for (int i = 0; i != value.length - position; i++) {
arrayOfByte[i] = value[(position + i)];
}
return new String(arrayOfByte);
}
private static int add(byte byte1, byte byte2) {
return (byte1 & 0xFF) + ((byte2 & 0xFF) << 8);
}
private static int add(byte byte1, byte byte2, byte byte3, byte byte4) {
return (byte1 & 0xFF) + ((byte2 & 0xFF) << 8) + ((byte3 & 0xFF) << 16) + ((byte4 & 0xFF) << 24);
}
private static int signed(int value, int length) {
if ((value & 1 << length - 1) != 0)
value = -1 * ((1 << length - 1) - (value & (1 << length - 1) - 1));
return value;
}
/**
* Convert hex byte array from motorola API to byte array.
*
* @param hexByteArray
* @return
*/
public static byte[] hexByteArrayToByteArray(byte[] hexByteArray) {
return hexStringToByteArray(new String(hexByteArray));
}
/**
* Convert string from motorola API to a byte array.
*
* @param hexString
* @return
*/
public static byte[] hexStringToByteArray(String hexString) {
int len = hexString.length();
byte[] data = new byte[len/2];
for (int i = 0; i < len; i += 2) {
data[i/2] = (byte) ((Character.digit(hexString.charAt(i), 16) << 4) + Character.digit(hexString.charAt(i + 1), 16));
}
return data;
}
}
size öğretmen veya bir şey tarafından belirli bir görevi var çünkü kendiniz uygulamak istiyor musunuz? Veya Java-Java sınıfını kullanmak mı istiyorsunuz? – TheChange
, eğer java sınıfı, 2 baytlık bir tamsayıya dönüştürecek bir yönteme sahipse, lütfen bana bildirin. – user121196
Mümkün [Kopyalama 4 bayt int] (http://stackoverflow.com/questions/2383265/convert-4-bytes-to-int) – OscarRyz