2008-09-23 14 views
5

Cách tốt nhất để chia số nguyên 32 bit thành bốn ký tự không dấu (chưa ký) trong C#.Chuyển đổi từ số nguyên 32 bit thành 4 ký tự

+0

gì bạn mong chờ các chars được? ASCII giải thích các byte? –

+0

Bạn có nghĩa là ký tự, hoặc byte? Ký tự là các ký tự riêng lẻ của văn bản trong một mã hóa đã cho, có thể tương ứng với nhiều byte - có thể không phải là những gì bạn muốn. –

Trả lời

7

quick'n'dirty:

int value = 0x48454C4F; 
Console.WriteLine(Encoding.ASCII.GetString(
    BitConverter.GetBytes(value).Reverse().ToArray() 
)); 

Chuyển đổi int để byte, đảo ngược các byte mảng cho đúng thứ tự và sau đó nhận được đại diện ký tự ASCII từ nó.

EDIT: Phương thức đảo ngược là phương pháp mở rộng từ .NET 3.5, chỉ để biết thông tin. Việc đảo ngược thứ tự byte cũng có thể không cần thiết trong kịch bản của bạn.

Chúc mừng, David

+0

Mục tiêu cuối cùng chỉ là in chúng vào bàn điều khiển? Nếu không, phương pháp này có rất nhiều chi phí không cần thiết, so với gợi ý của Jason và Sam. – Kip

+0

@Kip: Đây là một cách di động hơn để có được các byte cho nhiều hơn chỉ là số nguyên, mặc dù.Tuy nhiên, yêu cầu này khá kỳ lạ ở nơi đầu tiên - tại sao bạn muốn thử và mã hóa một số nguyên làm ký tự - trừ khi anh ta thực sự muốn nói byte? –

+0

@Kip: Như đã đề cập ở nơi đầu tiên, đây là câu trả lời nhanh và bẩn. Console.WriteLine chỉ dành cho tôi để có được một số đầu ra và bằng chứng nó hoạt động. Phần thú vị là các phương pháp được sử dụng để đạt được mục tiêu. – VVS

4

Nó không rõ ràng nếu điều này thực sự là những gì bạn muốn, nhưng:

int x = yourNumber(); 
char a = (char)(x & 0xff); 
char b = (char)((x >> 8) & 0xff); 
char c = (char)((x >> 16) & 0xff); 
char d = (char)((x >> 24) & 0xff); 

này giả định bạn muốn các byte hiểu là phạm vi thấp nhất của các ký tự Unicode.

0

Bạn nhận được 8-byte-khối:

int a = i & 255; // bin 11111111 
int b = i & 65280; // bin 1111111100000000 

làm phá vỡ ba byte đầu tiên xuống thành một byte đơn, chỉ cần chia chúng bằng số thích hợp và thực hiện một hợp lý và để có được byte cuối cùng của bạn.

Chỉnh sửa: Giải pháp của Jason với bithifts là điều tuyệt vời hơn nhiều.

5

Char? Có lẽ bạn đang tìm kiếm chức năng trợ giúp nhỏ tiện dụng này?

Byte[] b = BitConverter.GetBytes(i); 
Char c = (Char)b[0]; 
[...] 
0

.net sử dụng Unicode, một char là 2 byte không 1

Để chuyển đổi giữa dữ liệu nhị phân có chứa văn bản không phải unicode sử dụng lớp System.Text.Encoding .

Nếu bạn làm muốn 4 byte và không ký tự sau đó thay thế các char với byte trong câu trả lời của Jason

+0

Chỉ cần làm rõ: .net sử dụng Unicode được mã hóa là UCS-2 (ergo 2 byte). – tzot

4

Tôi đã thử nó một vài cách và tốc độ thời gian thực hiện để chuyển đổi 1000000 ints.

Built-in phương pháp chuyển đổi, 325000 ve:

Encoding.ASCII.GetChars(BitConverter.GetBytes(x)); 

Pointer chuyển đổi, 100000 ve:

static unsafe char[] ToChars(int x) 
{ 
    byte* p = (byte*)&x) 
    char[] chars = new char[4]; 
    chars[0] = (char)*p++; 
    chars[1] = (char)*p++; 
    chars[2] = (char)*p++; 
    chars[3] = (char)*p; 

    return chars; 
} 

Bitshifting, 77000 ve:

public static char[] ToCharsBitShift(int x) 
{ 
    char[] chars = new char[4]; 
    chars[0] = (char)(x & 0xFF); 
    chars[1] = (char)(x >> 8 & 0xFF); 
    chars[2] = (char)(x >> 16 & 0xFF); 
    chars[3] = (char)(x >> 24 & 0xFF); 
    return chars; 
}