tow*_*owi 5 java arrays nio bytebuffer bytearray
什么是一个转换最快的方法java.nio.ByteBuffer a为(新建)CharBuffer b或char[] b.
通过这样做很重要a[i] == b[i].这意味着,不是a[i]和a[i+1]在一起构成一个价值b[j],getChar(i)做什么,但价值应该"扩散".
byte a[] = { 1,2,3, 125,126,127, -128,-127,-126 } // each a byte (which are signed)
char b[] = { 1,2,3, 125,126,127, 128, 129, 130 } // each a char (which are unsigned)
Run Code Online (Sandbox Code Playgroud)
注意,它byte:-128具有相同(低8位)的位char:128.因此,我假设"最佳"解释将如上所述,因为位是相同的.
之后我还需要相反的翻译:最有效的方式来获得char[] 或java.nio.CharBuffer重新进入java.nio.ByteBuffer.
Paŭ*_*ann 12
所以,你想要的是使用编码ISO-8859-1进行转换.
我对效率没有任何要求,但至少写起来很短:
CharBuffer result = Charset.forName("ISO-8859-1").decode(byteBuffer);
Run Code Online (Sandbox Code Playgroud)
另一个方向是:
ByteBuffer result = Charset.forName("ISO-8859-1").encode(charBuffer);
Run Code Online (Sandbox Code Playgroud)
请根据其他解决方案进行衡量.(公平地说,Charset.forName不应该包括该部分,也应该只进行一次,而不是每次缓冲.)
从Java 7开始,还有StandardCharsets类,它具有预先实例化的Charset实例,因此您可以使用
CharBuffer result = StandardCharsets.ISO_8859_1.decode(byteBuffer);
Run Code Online (Sandbox Code Playgroud)
和
ByteBuffer result = StandardCharsets.ISO_8859_1.encode(charBuffer);
Run Code Online (Sandbox Code Playgroud)
代替.(这些行与之前的行相同,只是查找更容易,并且没有错误输入名称的风险,也不需要捕获不可能的异常.)
我同意@ Ishtar的建议,建议完全避免转换为新结构,只能根据需要进行转换.
但是,如果你有一个堆ByteBuffer你可以做.
ByteBuffer bb = ...
byte[] array = bb.array();
char[] chars = new char[bb.remaining()];
for (int i = 0; i < chars.length; i++)
chars[i] = (char) (array[i + bb.position()] & 0xFF);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
15061 次 |
| 最近记录: |