假设每次输入蒸汽的缓冲区读取1000个字节.缓冲区的开头有一些开始标志和视频名称,在实际视频内容之前,如100字节.我不想将它们写入结果缓冲区.所以第一次将101-999写入缓冲区.而第二次我希望写1000-1999.目前,它再次写入0-999,结果视频在实际视频内容之前有900个额外字节.
无论如何写缓冲区跳过第一个缓冲区长度?谢谢!
我想以下列方式使用java nio ByteBuffer的put方法:
ByteBuffer small = ByteBuffer.allocate(SMALL_AMOUNT_OF_BYTES);
ByteBuffer big = getAllData();
while (big.hasRemaining()){
small.put(big);
send(small);
}
Run Code Online (Sandbox Code Playgroud)
put方法会抛出缓冲区溢出异常,所以我要修复的是:
ByteBuffer small = ByteBuffer.allocate(SMALL_AMOUNT_OF_BYTES);
ByteBuffer big = getAllData();
while (big.hasRemaining()){
while (small.hasRemaining() && big.hasRemaining()){
small.put(big.get());
}
send(small);
}
Run Code Online (Sandbox Code Playgroud)
我的问题是 - 有更好的方法这样做,或者至少有效的方式来做我想要的吗?
下面的Java代码:
import java.io.IOException;
import java.net.InetSocketAddress;
import java.nio.ByteBuffer;
import java.nio.channels.SocketChannel;
public class Test {
public static void main(String args[]) throws IOException {
SocketChannel c = SocketChannel.open();
c.connect(new InetSocketAddress("google.com", 80));
ByteBuffer b = ByteBuffer.allocate(1024);
b.put("Request".getBytes());
System.out.println("Write: " + c.write(b));
int i;
while ((i = c.read(b)) != -1) {
System.out.println("Read: " + i);
b.clear();
}
}
}
Run Code Online (Sandbox Code Playgroud)
实际结果:
写:1017阅读:0阅读:1024阅读:44
第一次,方法read()读取0个字节.这不酷.
我修改了我的代码:
b.put("Request".getBytes());
System.out.println("Write: " + c.write(b));
b.flip(); //I added this line
int i;
while ((i = c.read(b)) != -1) {
System.out.println("Read: …Run Code Online (Sandbox Code Playgroud) 我正在尝试构建一个简单的XOR函数,用于解密单个字符的十六进制密钥.它适用于多个角色和个别角色......但仅限于"A"到"F".从"G"开始,它不断抛出"FormatException".
这是问题函数,传递两个字符串:
// For Reference:
// strHexKey = "G";
// strHexInput = "1b37373331363f78151b7f2b783431333d78397828372d363c78373e783a393b3736"
private string SCXOR_Update(string strHexKey, string strHexInput)
{
byte[] buffer1 = hexbuffer(strHexInput);
byte buffer2 = Convert.ToByte(Convert.ToInt32(strHexKey, 16));
byte[] result = buffer1;
for (int i = 0; i < (strHexInput.Length / 2); i++)
{
result[i] = (byte)(buffer1[i] ^ buffer2);
}
return BitConverter.ToString(result).Replace("-", "");
}
Run Code Online (Sandbox Code Playgroud)
在"byte buffer2"行抛出异常,并且仅在从字母"G"向上推进时发生.
知道我错过了什么吗?它必须在脸上瞪着我?!
提前致谢!
我试图读取txt文件使用RandomAccessFile并且FileChannel包含大量的浮点/整数值,但在使用ByteBuffer我得到的值的所有对话之后,与txt文件中的值不同.我是这样做的:
RandomAccessFile mRandomFile = new RandomAccessFile(Environment.getExternalStorageDirectory() + "/Models/vertices.txt", "rw");
FileChannel mInChannel = mRandomFile.getChannel();
ByteBuffer mBuffer = ByteBuffer.allocate(181017 * 4);
mBuffer.clear();
mInChannel.read(mBuffer);
mBuffer.rewind();
FloatBuffer mFloatBUffer = mBuffer.asFloatBuffer();
mFloatBUffer.get(VERTS);
mInChannel.close();
for (int i = 0; i < 20; i++) {
Log.d("", "VALUE: " + VERTS[i]);
}
Run Code Online (Sandbox Code Playgroud)
txt文件中的值以这种方式显示(它们用新行分隔):
-36.122300
-6.356030
-46.876744
-36.122303
-7.448818
-46.876756
-36.122303
-7.448818
81.123221
-36.122300
-6.356030
81.123209
36.817676
-6.356030
-46.876779
36.817676
-7.448818
-46.876779
-36.122303
-7.448818
Run Code Online (Sandbox Code Playgroud)
我得到的价值for是:
VALUE: 1.0187002E-11
VALUE: 2.5930944E-9
VALUE: 6.404289E-10 …Run Code Online (Sandbox Code Playgroud) 我在java中记录了一些代码.在我问我的问题之前,我会给你们一些背景信息.目标是读取和处理orsm文件,该文件是包含十六进制代码的文件.
流程如下:使用FileChannel将somme字节读入ByteBuffer.填充缓冲区后,将每个字节转换为有符号整数.这是使用移位运算符完成的,如下所示:
return (0x000000ff & (bb.get() << 0)) |
(0x0000ff00 & (bb.get() << 8)) |
(0x00ff0000 & (bb.get() << 16)) |
(0xff000000 & (bb.get() << 24));
Run Code Online (Sandbox Code Playgroud)
其中bb属于Bytebuffer.我完全不知道这段代码是如何以及为什么有效的,我搜索了一个出价,我找到的关闭的东西是这个旧的stackoverflow主题.我仍然没有任何线索,我想知道你是否可以帮助我解决这个代码剪断?
我有以下结构:
struct sample {
uint8_t four;
bool b;
uint8_t two;
};
Run Code Online (Sandbox Code Playgroud)
为了发送udp数据包,我需要将这些值打包成一个字节:
| 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
+---+---+---+---+---+---+---+---+
| four | 0 | b | two |
+---------------+---+---+-------+
Run Code Online (Sandbox Code Playgroud)
在这个字节中复制struct值的最佳方法是什么?我在检查之前检查了前提条件,因此在将uint8_t值复制到更小的空间时不会丢失任何数据.
我有一个项目,使用 boost.asio 套接字在客户端和服务器之间传输数据。一旦连接的一侧接收到数据,它就会将其转换为 of std::vectors std::string,然后通过先前定义的“回调”函数将其传递到数据的实际接收者对象。到目前为止,这种方式工作得很好,只是,我此时使用atoi()和之类的方法to_string将字符串以外的其他数据类型转换为可发送格式并返回。当然,这种方法在网络使用方面有点浪费(特别是当传输的数据量大于单个整数和浮点数时)。因此我想序列化和反序列化数据。实际上,任何序列化方法都会生成字节数组或缓冲区,因此对我来说使用它会很方便std::string。这样做有什么坏处吗?我不明白为什么应该有一次,因为字符串应该只不过是字节数组。
我想将String转换"1B4322C2"为字节,但问题是,如果我使用getBytes()它将它转换为字符串的长度加倍的字节,我想将它们转换为字符串长度的一半.
例如,上面字符串的输出应该是 {0x1B , 0x43, 0x22, 0xC2}
谢谢
我使用STB库将图像加载到内存中.特定函数stbi_load返回指向a的指针unsigned char,该指针是一个数组.
我很想将新的C++ 17 API用于原始数据,std::byte这将使我更具表现力,让我逐个像素地对原始数据进行别名,或者通过将其转换为不同的数据类型来逐个颜色(不同大小的整数).
现在我尝试了这个:
std::unique_ptr<std::byte[], stbi_deleter>(stbi_load(...));
Run Code Online (Sandbox Code Playgroud)
当然,由于缺乏隐式转换,它不起作用.
然后我尝试了:
std::unique_ptr<std::byte[], stbi_deleter>(
static_cast<std::byte*>(stbi_load(...))
);
Run Code Online (Sandbox Code Playgroud)
同样,它仍然没有奏效.我不得不决定使用reinterpret_cast.并让我怀疑这种转换是否合法.我unsigned char*可以std::byte* 根据严格的别名规则合法地转换为?然后我可以将数据转换为另一种数据类型std::uint32_t*并进行变异吗?这会破坏别名规则吗?
我知道有很多关于这个主题的问题,但我认为找不到合适的关键字,所以我问.
我想打印出一个字节缓冲区的字节到十六进制表示法(0xABCDEF)的控制台输出,但我不知道什么是字节缓冲区,它用于什么?
我需要以下的东西,我只是一个初学者,所以请简单,我可以得到.(在c/c ++中)
@param pBytes指向字节缓冲区的指针@param nBytes字节缓冲区的长度,以字节为单位
void PrintBytes(const char* pBytes, const uint32_t nBytes);
Run Code Online (Sandbox Code Playgroud)
我需要那些功能.
你不需要给出我需要你的答案,让我更容易!谢谢!