Bitmap bmp = intent.getExtras().get("data");
int size = bmp.getRowBytes() * bmp.getHeight();
ByteBuffer b = ByteBuffer.allocate(size);
bmp.copyPixelsToBuffer(b);
byte[] bytes = new byte[size];
try {
b.get(bytes, 0, bytes.length);
} catch (BufferUnderflowException e) {
// always happens
}
// do something with byte[]
Run Code Online (Sandbox Code Playgroud)
当我在调用copyPixelsToBuffer
字节后查看缓冲区全部为0 ...从摄像机返回的位图是不可变的......但这应该无关紧要,因为它正在进行复制.
这段代码有什么问题?
ByteBuffer
Java 中的示例应用程序是什么?请列出使用此方法的任何示例方案.谢谢!
要allocate()
或者allocateDirect()
,这是一个问题.
多年以来我一直坚持认为,因为DirectByteBuffer
s是OS级别的直接内存映射,所以get/put调用的执行速度比HeapByteBuffer
s 快.到目前为止,我从未真正有兴趣了解有关情况的具体细节.我想知道两种类型的ByteBuffer
哪种更快,哪种条件更快.
我想将字节数组转换为图像.
这是我获取字节数组的数据库代码:
public void Get_Finger_print()
{
try
{
using (SqlConnection thisConnection = new SqlConnection(@"Data Source=" + System.Environment.MachineName + "\\SQLEXPRESS;Initial Catalog=Image_Scanning;Integrated Security=SSPI "))
{
thisConnection.Open();
string query = "select pic from Image_tbl";// where Name='" + name + "'";
SqlCommand cmd = new SqlCommand(query, thisConnection);
byte[] image =(byte[]) cmd.ExecuteScalar();
Image newImage = byteArrayToImage(image);
Picture.Image = newImage;
//return image;
}
}
catch (Exception) { }
//return null;
}
Run Code Online (Sandbox Code Playgroud)
我的转换代码:
public Image byteArrayToImage(byte[] byteArrayIn)
{
try
{
MemoryStream ms = new MemoryStream(byteArrayIn,0,byteArrayIn.Length);
ms.Write(byteArrayIn, 0, …
Run Code Online (Sandbox Code Playgroud) 这是从ByteBuffer获取字节的推荐方法
ByteBuffer bb =..
byte[] b = new byte[bb.remaining()]
bb.get(b, 0, b.length);
Run Code Online (Sandbox Code Playgroud) 为什么ByteBuffer的flip()方法称为"翻转"?什么是"翻转"在这里?根据apidoc,连续两次翻转将不会恢复原始状态,并且多次翻转可能趋于limit()
变为零.
我能以某种方式"解开"重用字节超出限制吗?
我可以将尾部连接到其他一些数据吗?
我使用Java NIO进行套接字连接,我的协议是基于文本的,所以我需要能够在将字符串转换为SocketChannel之前将其转换为ByteBuffers,并将传入的ByteBuffers转换回字符串.目前,我正在使用此代码:
public static Charset charset = Charset.forName("UTF-8");
public static CharsetEncoder encoder = charset.newEncoder();
public static CharsetDecoder decoder = charset.newDecoder();
public static ByteBuffer str_to_bb(String msg){
try{
return encoder.encode(CharBuffer.wrap(msg));
}catch(Exception e){e.printStackTrace();}
return null;
}
public static String bb_to_str(ByteBuffer buffer){
String data = "";
try{
int old_position = buffer.position();
data = decoder.decode(buffer).toString();
// reset buffer's position to its original so it is not altered:
buffer.position(old_position);
}catch (Exception e){
e.printStackTrace();
return "";
}
return data;
}
Run Code Online (Sandbox Code Playgroud)
这在大多数情况下都有效,但我怀疑这是否是执行此转换的每个方向的首选(或最简单)方法,或者是否有其他方法可以尝试.偶尔,和看似随意,调用encode()
和decode()
将抛出一个
java.lang.IllegalStateException: Current …
是否真的有必要unsigned char
像在一些处理字符编码或二进制缓冲区的库中一样使用二进制数据?要理解我的问题,请看下面的代码 -
char c[5], d[5];
c[0] = 0xF0;
c[1] = 0xA4;
c[2] = 0xAD;
c[3] = 0xA2;
c[4] = '\0';
printf("%s\n", c);
memcpy(d, c, 5);
printf("%s\n", d);
Run Code Online (Sandbox Code Playgroud)
两者printf's
输出 correctly, where
f0 a4 ad a2
Unicode代码点的编码U+24B62 ()
在十六进制中.
甚至memcpy
还正确地复制了char所持有的位.
什么推理可能主张使用unsigned char
而不是plain char
?
在其他相关问题unsigned char
中突出显示,因为它是唯一的(字节/最小)数据类型,保证C规范没有填充.但正如上面的例子所示,输出似乎不受任何填充的影响.
我使用VC++ Express 2010和MinGW来编译上面的内容.虽然VC给出了警告
warning C4309: '=' : truncation of constant value
输出似乎没有反映出来.
PS这可以标记为可能重复的字节缓冲区应该是有符号的还是无符号的char缓冲区?但我的意图是不同的.我在问为什么一些似乎工作正常的东西char
应该输入unsigned char
?
更新:引用N3337,
Section …
我有一个方法,它接受一个InputStream并从中读取数据.我想将此方法与ByteBuffer一起使用.有没有办法包装ByteBuffer所以它可以作为流访问?
有没有人见过java.nio.ByteBuffer的实现,如果putX()调用超出容量,它将动态增长?
我想这样做的原因有两个: