2013-02-20 22 views
5

Tôi đang làm việc để chuyển đổi một loạt các tệp kết xuất cơ sở dữ liệu MySQL được phân tách bằng tab cũ thành Bộ đệm giao thức và đã chạy vào một thẻ. Bảng MySQL bao gồm một trường kiểu int(11) unsigned, mà tôi đã ánh xạ tới protobuf uint32 trong tệp .proto. Khi phân tích cú pháp các bản ghi MySQL và cố gắng chuyển đổi chúng thành một thông điệp protobuf, nó sẽ hấp dẫn để phân tích trường đó bằng cách sử dụng Integer.valueOf(String) (hoặc Long.valueOf(String) để tránh tràn). Tuy nhiên, Protocol Buffers Language Guide chỉ ra here rằng trong Java, uint32 s được thể hiện bằng kiểu dữ liệu int, nhưng bit đầu tiên được hiểu là bit bậc cao nhất chứ không phải bit dấu.Làm cách nào để chuyển đổi các int không dấu của MySQL sang các Uint32 của Protocol Buffer trong Java?

Vì vậy, trước khi tôi đi viết của riêng tôi String ->uint32 -flavored- int phân tích cú pháp, tôi nghĩ rằng nó là giá trị yêu cầu cho dù bất cứ ai khác đã giải quyết vấn đề cụ thể này. Cách chính xác để chuyển đổi một biểu diễn String của MySQL int unsigned thành Bộ đệm giao thức uint32 bằng Java là gì?

Trả lời

1

String để int đại diện cho uint32

Tôi muốn cố gắng phân tích cú pháp như long và sau đó chuyển đổi để int:

int i = (int)Long.parseLong(str); 

Sử dụng long cho việc chuyển đổi tránh một NumberFormatException do một loạt vượt quá. Sau đó narrowing conversion sẽ giảm một nửa quan trọng hơn của các bit kết quả, để lại cho bạn chính xác với biểu diễn được yêu cầu bởi bộ đệm giao thức.

String để dài đại diện cho uint64

Chuyển đổi tương tự cho uint64 sử dụng BigInteger có thể có thể được viết như sau (mã chưa được kiểm tra):

long l = (new BigInteger(str)).longValue(); 

này dựa trên một cắt ngắn ngầm, giống như ở trên trường hợp. Các trạng thái documentation:

Nếu điều này BigInteger quá lớn để phù hợp trong một thời gian dài, chỉ có bit 64 bit thấp được trả về.

Int đại diện uint dài

Nếu bạn muốn chuyển đổi như một int mà thực sự đại diện cho một uint32 đến một long với dấu hiệu tích cực, bạn nên chắc chắn để xóa 32 bit quan trọng nhất, vì chúng sẽ được lấp đầy với các bản sao của bit quan trọng nhất của giá trị int, do bản chất mở rộng ký hiệu của số widening conversion.

long uintValue = intValue & 0xffffffffL; 
+0

Tôi đã đi đến một kết luận tương tự, nhưng bạn thực hiện nó rõ ràng hơn tôi đã làm. Điều này cho thấy một câu hỏi tương tự: làm thế nào để phân tích cú pháp 'unsigned bigint' thành protobuf' uint64' bằng Java? –

+0

Giải pháp của bạn cũng cho thấy rằng việc chuyển đổi có thể được thực hiện đơn giản bằng cách truyền lại từ 'int' sang' long', điều này rất hay. –

+0

@JoshHansen, tôi đã cập nhật câu trả lời của tôi để đáp lại cả nhận xét của bạn. – MvG

0

Nếu sự kết thúc không phải là một vấn đề, thì bạn có thể đe dọa int không dấu là mảng byte có độ dài cố định.

Các vấn đề liên quan