Tôi muốn đặt một chuỗi vào một mảng byte, nhưng chuỗi có thể quá lớn để vừa. Trong trường hợp nó quá lớn, tôi muốn đặt càng nhiều chuỗi càng tốt vào mảng. Có cách nào hiệu quả để tìm ra số lượng nhân vật phù hợp không?Làm cách nào để cắt ngắn chuỗi trong khi chuyển đổi thành byte trong C#?
Trả lời
Để cắt một chuỗi để một mảng UTF8 byte mà không cần tách ở giữa một nhân vật tôi sử dụng này:
static string Truncate(string s, int maxLength) {
if (Encoding.UTF8.GetByteCount(s) <= maxLength)
return s;
var cs = s.ToCharArray();
int length = 0;
int i = 0;
while (i < cs.Length){
int charSize = 1;
if (i < (cs.Length - 1) && char.IsSurrogate(cs[i]))
charSize = 2;
int byteSize = Encoding.UTF8.GetByteCount(cs, i, charSize);
if ((byteSize + length) <= maxLength){
i = i + charSize;
length += byteSize;
}
else
break;
}
return s.Substring(0, i);
}
Chuỗi trở có thể sau đó được chuyển an toàn đến một mảng byte chiều dài maxLength.
Bạn nên sử dụng lớp Mã hóa để chuyển đổi thành mảng byte đúng không? Tất cả các đối tượng Mã hóa đều có phương thức ghi đè GetMaxCharCount, sẽ cung cấp cho bạn "Số ký tự tối đa được tạo ra bằng cách giải mã số byte được chỉ định." Bạn sẽ có thể sử dụng giá trị này để cắt chuỗi của bạn và mã hóa chính xác nó.
cách hiệu quả sẽ là việc tìm kiếm bao nhiêu (bi quan) byte, bạn sẽ cần mỗi nhân vật với
Encoding.GetMaxByteCount(1);
sau đó chia cho kích thước chuỗi của bạn bằng cách kết quả, sau đó chuyển đổi mà nhân vật nhiều với
public virtual int Encoding.GetBytes (
string s,
int charIndex,
int charCount,
byte[] bytes,
int byteIndex
)
Nếu bạn muốn sử dụng ít bộ nhớ hơn, hãy sử dụng
Encoding.GetByteCount(string);
nhưng đó là một phương pháp chậm hơn nhiều.
Lớp mã hóa trong .NET có phương thức được gọi là GetByteCount
có thể lấy một chuỗi hoặc ký tự []. Nếu bạn vượt qua trong 1 ký tự, nó sẽ cho bạn biết có bao nhiêu byte là cần thiết cho rằng 1 ký tự trong bất kỳ mã hóa bạn đang sử dụng.
Phương pháp GetMaxByteCount
nhanh hơn, nhưng tính toán trường hợp xấu nhất có thể trả lại số cao hơn số thực sự cần thiết.
Cookey, mã của bạn không làm những gì bạn nghĩ rõ ràng. Việc cấp phát bộ đệm byte trong trường hợp của bạn là chất thải thuần túy vì nó sẽ không được sử dụng. Thay vào đó, nhiệm vụ của bạn giảm bộ nhớ được cấp phát và đặt lại tham chiếu arr
để trỏ đến bộ đệm khác vì Encoding.GetBytes
trả về một mảng mới.
- 1. Chuyển đổi mảng ngắn thành chuỗi C#
- 2. Chuyển mảng byte thành mảng ngắn trong C#
- 3. chuyển đổi byte thành chuỗi C#
- 4. Chuyển mảng byte thành chuỗi trong C#
- 5. Chuyển đổi một byte thành chuỗi nhị phân trong C#
- 6. Cách ngắn nhất để chuyển đổi các byte này thành int trong python?
- 7. Làm cách nào để cắt ngắn danh sách trong C#?
- 8. Làm thế nào để chuyển đổi chuỗi Java thành byte []?
- 9. Làm thế nào để chuyển đổi chuỗi thành mảng byte?
- 10. làm thế nào để chuyển đổi chuỗi thành byte [] trong C#
- 11. Làm thế nào để cắt ngắn chuỗi UTF8 trong PHP?
- 12. Cách chuyển chuỗi thành byte trong Java
- 13. Chuyển đổi byte để chuỗi trong Java
- 14. Chuyển đổi chuỗi unicode thành chuỗi byte
- 15. Làm cách nào để chuyển đổi bit thành byte?
- 16. Chuyển mảng byte thành chuỗi trong javascript
- 17. C++ gamedev: cắt ngắn phao thành int
- 18. Làm cách nào để chuyển đổi chuỗi UTF-8 thành một mảng các byte trong Dart?
- 19. Trong Java, làm cách nào để chuyển đổi chuỗi hex thành byte []?
- 20. Làm cách nào để chuyển đổi chuỗi C++ thành int?
- 21. C#: Chuyển đổi byte [] thành chuỗi được mã hóa UTF8
- 22. Chuỗi từ mảng byte không được cắt bớt trong C#?
- 23. Làm cách nào để chuyển đổi từ chuỗi chuỗi thành chuỗi trong C++?
- 24. Chuyển đổi byte ASCII [] thành chuỗi
- 25. Làm cách nào để chuyển đổi byte [] thành luồng trong C#?
- 26. Phương pháp ngắn nhất để chuyển đổi mảng thành chuỗi trong C#/LINQ
- 27. Làm thế nào để chuyển đổi char * thành unsigned ngắn trong C++
- 28. Làm thế nào để cắt ngắn chuỗi thành độ dài yêu cầu trong sdk iphone?
- 29. chuyển đổi int để ngắn trong C
- 30. Cắt ngắn chuỗi bằng Bytes
Điều này không hoạt động nếu giới hạn của anh là số byte. (Chỉ khi giới hạn là số ký tự) – roim