Để convert 4 bytes sang 1 số nguyên lớn trong Java ta cần làm như sau:
- Tạo mảng 4 bytes cho dễ quản lý
- cast về kiểu long
- khi cast để tránh ra số âm cần bitmask 1 byte với 0xFF, vì trong Java loại byte lưu có dấu range từ [-128, 127]
- Cuối cùng bit shift
Cụ thể ta có hàm sau:
/** * get a number that greater 2 billions (2,147,483,647) * * @param a * @return */ public static long ToLittleEndianUint32Java(byte[] a) { int idx = 0; long ret = 0; ret |= (a[idx++] & 0xFF); ret |= (long) (a[idx++] & 0xFF) << 8; ret |= (long) (a[idx++] & 0xFF) << 16; ret |= (long) (a[idx++] & 0xFF) << 24; return ret; }
Ví dụ:
int offset = 10; ToLittleEndianUint32Java(Arrays.copyOfRange(block, offset, offset + 4));
Ví dụ này cho phép ta convert 4 byte thành 1 số nguyên dương lớn hơn 2 tỷ, 4 tỷ (vì ta dùng long)
Nếu cast về int và trả về int thì có thể bạn sẽ nhận được số âm vì trong Java kiểu int chỉ lưu được các số từ: âm 2 tỷ đến 2 tỷ [-2147483648, 2147483647]
Tham khảo thêm cách dùng: Copy mảng byte trong Java bằng Arrays.copyOfRange()
Các bài viết không xem thì tiếc:
- Copy mảng byte trong Java bằng Arrays.copyOfRange()
- Lưu ý khi porting C/C++ sang Java
- Thuật toán tìm kiếm nhị phân (Binary Search)
- Cách dùng AsyncTask trong Android
- Thuật toán tìm kiếm tuyến tính (Linear Search)
- Hiểu về cách tổ chức file, bộ nhớ của app Android
- Đọc file và ghi file vào bộ nhớ internal Android từ thư mục raw
- Làm việc với font trong Android
- Gửi dữ liệu đến BLESerial3 bằng Bluetooth LE Android
- Làm tròn số phút lên 5 trong java
- Tổng quan nhất về ứng dụng Android
- Siêu tổng hợp iOS code snippets – Objective C
- Chuyển một đối tượng sang Json trong Android
- Cách dùng Eventbus để truyền dữ liệu trong Android
- Phóng to thu nhỏ trong Android với ScaleGestureDetector
1 Comment