Vì vậy, tại nơi làm việc hôm qua, tôi phải viết một ứng dụng để đếm các trang trong một tệp AFP. Vì vậy, tôi dusted off MO của tôi: DCA spec PDF và tìm thấy các lĩnh vực có cấu trúc BPG (Begin Page)
và định danh 3 byte của nó. Ứng dụng cần chạy trên một hộp AIX, vì vậy tôi quyết định viết nó trong Java.Hiểu các byte Java
Để đạt hiệu quả tối đa, tôi quyết định rằng tôi sẽ đọc 6 byte đầu tiên của mỗi trường có cấu trúc và sau đó bỏ qua các byte còn lại trong trường. Điều này sẽ làm cho tôi:
0: Start of field byte
1-2: 2-byte length of field
3-5: 3-byte sequence identifying the type of field
Vì vậy, tôi kiểm tra các loại hình trường và tăng số đếm trang nếu nó BPG
, và tôi không nếu nó không. Sau đó, tôi bỏ qua các byte còn lại trong trường thay vì đọc qua chúng. Và ở đây, trong việc bỏ qua (và thực sự trong chiều dài trường) là nơi tôi phát hiện ra rằng Java sử dụng các byte đã ký.
Tôi đã thực hiện một số công cụ tìm kiếm và tìm thấy khá nhiều thông tin hữu ích. Hữu ích nhất, tất nhiên, là hướng dẫn để thực hiện một bitwise &
đến 0xff
để nhận giá trị int chưa ký. Điều này là cần thiết cho tôi để có được một chiều dài có thể được sử dụng trong việc tính toán số byte để bỏ qua.
Bây giờ tôi biết rằng tại 128, chúng tôi bắt đầu đếm ngược từ -128. Những gì tôi muốn biết là làm thế nào hoạt động bitwise hoạt động ở đây - cụ thể hơn, làm thế nào tôi đến đại diện nhị phân cho một số âm.
Nếu tôi hiểu bitwise &
đúng cách, kết quả của bạn bằng một số chỉ có các bit chung của hai số được đặt. Vì vậy, giả sử byte b = -128
, chúng ta sẽ có:
b & 0xff // 128
1000 0000-128
1111 1111 255
---------
1000 0000 128
Vì vậy, làm thế nào tôi sẽ đến ở 1000 0000 cho -128? Làm thế nào tôi sẽ nhận được biểu diễn nhị phân của một cái gì đó ít rõ ràng như -72 hoặc -64?
+1 để đề cập đến hoạt động xảy ra trong phần int có đuôi mở rộng. –
Đây chính xác là những gì tôi đã làm sau, cảm ơn bạn rất nhiều.Đây là lý do tại sao tôi yêu Stackoverflow. –