2009-05-20 36 views
5

Hãy tha thứ cho tôi nếu điều này đã được yêu cầu trước đó, nhưng tôi đảm bảo với bạn rằng tôi đã lùng sục Internet và đã không bật lên, có lẽ vì tôi không có thuật ngữ đúng. (?)Mã hóa ... một số loại?

Tôi muốn lấy một số nguyên và chuyển nó sang một chút về cuối nhỏ đại diện hex như thế này:

303 -> 0x2f010000

Tôi có thể thấy rằng các byte được đóng gói như vậy mà Vị trí của 16 và 1 đều nằm trong cùng một byte, và vị trí của 4096 và vị trí của 256 chia sẻ một byte. Nếu ai đó có thể chỉ cho tôi đúng thuật ngữ cho mã hóa như vậy, tôi chắc chắn tôi có thể tìm thấy câu trả lời của tôi về cách thực hiện nó. Cảm ơn!

+0

Bạn đang tìm kiếm một chức năng như một dec2hex? Nhiều ngôn ngữ có cơ sở để chuyển đổi một số thập phân thành một biểu diễn thập lục phân. – Kekoa

+3

+1 có thể là câu hỏi lịch sự mà tôi từng thấy trên SO. :-) –

+0

Chuyển đổi thẳng sang hex không phải là vấn đề - Như trong ví dụ này, tôi có thể chuyển đổi từ 303 đến 12f bằng chuyển đổi hex. Những gì tôi cần là mã hóa bằng cách sử dụng một byte để giữ mỗi cặp hex "địa điểm", nếu điều đó có ý nghĩa. – Blumer

Trả lời

2

nhà khai thác sử dụng chút thay đổi kết hợp với phép toán AND và OR khai thác ...

giả sử 32 bit unsigned:

int value = 303; 
int result = 0x00000000; 

for (int i = 0; i < 4; i++) 
{ 
    result = result | ((value & (0xFF << (i * 8))) << (24 - (i * 8))); 
} 
+0

Cảm ơn, Demi. Tôi không nghĩ rằng điều này đã kết thúc được khá những gì tôi cần, nhưng có lẽ nhiều hơn bởi vì tôi đã không hoàn toàn mô tả vấn đề đầy đủ. – Blumer

+0

@Blumer: đoạn mã của bạn trong vb thực chất là giống nhau, chỉ với một thứ tự hơi khác nhau của các phép toán và với phân chia số nguyên thay vì các phép toán bit. Về cơ bản, bạn thực sự là byte hoán đổi byte 0 với byte 3 và byte 1 với byte 2 – Demi

2

Big-endian và ít về cuối nhỏ đề cập đến thứ tự của các byte trong bộ nhớ . Một giá trị như 0x2f100000 không có tính xác thực nội tại, tính cuối cùng phụ thuộc vào kiến ​​trúc CPU.

Nếu bạn luôn muốn đảo ngược thứ tự các byte trong giá trị 32 bit, hãy sử dụng mã mà Demi đã đăng.

Nếu bạn luôn muốn nhận thứ tự byte cụ thể (vì bạn đang chuẩn bị chuyển các byte đó qua mạng hoặc lưu chúng vào một tệp đĩa), hãy sử dụng một thứ khác. Ví dụ. thư viện ổ cắm BSD có hàm htonl() lấy giá trị 32 bit gốc của CPU và đặt nó vào thứ tự lớn.

Nếu bạn đang chạy trên một máy tính nhỏ, htonl (303) == 0x2f100000. Nếu bạn đang chạy trên một máy tính lớn, htonl (303) == 303. Trong cả hai trường hợp, kết quả sẽ được biểu thị bằng byte [0x00, 0x00, 0x01, 0x2f] trong bộ nhớ.

0

Nếu bất cứ ai có thể đặt cụm từ cụ thể vào những gì tôi đang cố gắng làm, tôi vẫn muốn nghe nó. Tôi đã làm, tuy nhiên, tìm cách để làm những gì tôi cần, và tôi sẽ đăng nó ở đây vì vậy nếu có ai đến chăm sóc tôi, họ có thể tìm thấy nó. Có thể có (có lẽ là) một cách dễ dàng hơn, trực tiếp hơn để làm điều đó, nhưng đây là những gì tôi đã kết thúc làm trong VB.Net để lấy lại bytecode tôi muốn:

Private Function Encode(ByVal original As Integer) as Byte()  
    Dim twofiftysixes As Integer = CInt(Math.Floor(original/256)) 
    Dim sixteens As Integer = CInt(Math.Floor((original - (256 * twofiftysixes))/16)) 
    Dim ones As Integer = original Mod 16 
    Dim bytecode As Byte() = {CByte((16 * sixteens) + ones), CByte(twofiftysixes), 0, 0} 
    Return bytecode 
End Function 

có hiệu quả phá vỡ nguyên thành của nó thành phần hex, sau đó chuyển đổi các cặp thích hợp thành cBytes.

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