- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
对于原始数组的序列化,我想知道如何将 Primitive[] 转换为他对应的 byte[]。 (即 int[128] 到 byte[512],或 ushort[] 到 byte[]...)目标可以是内存流、网络消息、文件或任何东西。目标是性能(序列化和反序列化时间),以便能够用一些流一次性写入一个字节[],而不是循环“遍历”所有值,或者使用一些转换器进行分配。
一些已经探索的解决方案:
写入/读取的常规循环
//array = any int[];
myStreamWriter.WriteInt32(array.Length);
for(int i = 0; i < array.Length; ++i)
myStreamWriter.WriteInt32(array[i]);
此解决方案适用于序列化和反序列化,比使用标准 System.Runtime.Serialization 结合 BinaryFormater 来序列化/反序列化单个 int 或多个 int 快 100 倍。
但如果 array.Length 包含超过 200/300 个值(对于 Int32),此解决方案会变慢。
Actor ?
似乎 C# 无法直接将 Int[] 转换为 byte[],或将 bool[] 转换为 byte[]。
BitConverter.Getbytes()
这个解决方案有效,但它会在每次调用循环时通过我的 int[] 分配一个新的 byte[]。表演当然很糟糕
Marshal.Copy
是的,这个解决方案也有效,但问题与之前的 BitConverter 解决方案相同。
C++ 破解
因为在 C# 中不允许直接转换,在看到内存中数组长度在数组数据开始之前存储了 4 个字节后,我尝试了一些 C++ hack
ARRAYCAST_API void Cast(int* input, unsigned char** output)
{
// get the address of the input (this is a pointer to the data)
int* count = input;
// the size of the buffer is located just before the data (4 bytes before as this is an int)
count--;
// multiply the number of elements by 4 as an int is 4 bytes
*count = *count * 4;
// set the address of the byte array
*output = (unsigned char*)(input);
}
和调用的 C#:
byte[] arrayB = null;
int[] arrayI = new int[128];
for (int i = 0; i < 128; ++i)
arrayI[i] = i;
// delegate call
fptr(arrayI, out arrayB);
我成功地将我的 int[128] 检索到 C++ 中,切换数组长度,并影响到我的“输出”var 的正确地址,但 C# 仅检索一个字节 [1] 作为返回。看来我不能那么容易地破解这样的托管变量。
所以我真的开始认为我想要实现的所有这些转换在 C# 中是不可能的(int[] -> byte[]、bool[] -> byte[]、double[] -> byte[]。 ..) 无需分配/复制...
我错过了什么?
最佳答案
如何使用 Buffer.BlockCopy
?
// serialize
var intArray = new[] { 1, 2, 3, 4, 5, 6, 7, 8 };
var byteArray = new byte[intArray.Length * 4];
Buffer.BlockCopy(intArray, 0, byteArray, 0, byteArray.Length);
// deserialize and test
var intArray2 = new int[byteArray.Length / 4];
Buffer.BlockCopy(byteArray, 0, intArray2, 0, byteArray.Length);
Console.WriteLine(intArray.SequenceEqual(intArray2)); // true
请注意,BlockCopy
仍在幕后进行分配/复制。我相当确定这在托管代码中是不可避免的,并且 BlockCopy
可能已经达到了它的最佳状态。
关于c# - 如何将 Primitive[] 转换为 byte[],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30983019/
这只是一个练习,但我无法弄清楚其中的歧义: private static void flipFlop(String str, int i, Integer iRef) { System.out.pri
我假设 jls 中描述的转换是根据优先级排序的。首先具有更高的优先级。 jls 因此我解决了 Boxing 比 Unboxing 具有更高的优先级。我决定检验这个假设。 研究以下代码: public
我的问题看起来很简单。 int i =99999; long square = i*i; System.out.println(square); //prints 1409865409 - inc
我有一种情况,我必须更改 java 常量。 我有下面的代码工作 import java.lang.reflect.Field; import java.lang.reflect.Modifier; p
Section 4.2 of the Java Language Specification指出,“原始值不与其他原始值共享状态”。这到底是什么意思? 最佳答案 这意味着原始类型的每个值都在内存中占据
我想将对原始类型的引用传递给一个方法,这可能会改变它。 考虑以下示例: public class Main { Integer x = new Integer(42); Integer
为了学习依赖类型,我正在用 Idris 重写我的旧 Haskell 游戏。目前游戏“引擎”使用内置的整数类型,例如 Word8 .我想证明一些涉及这些数字的数字属性的引理(例如,双重否定是身份)。但是
我从react-primitives自述文件https://github.com/lelandrichardson/react-primitives#readme中读取内容,指出我们需要安装目标平台库
让我们以jackson序列化器为例,假设我们有一个这样的类: public class Car { private String brand; private Integer weig
出于某种原因,我想做这样的事情: template void write(const Data& data) { std::fstream out {...}; out.write(r
由于 C# 中的 struct 由其成员的位组成,因此您不能拥有包含任何 T 字段的值类型 T: // Struct member 'T.m_field' of type 'T' causes a c
这个问题在这里已经有了答案: Why does int i = 1024 * 1024 * 1024 * 1024 compile without error? (5 个回答) 关闭8年前。 在Jav
在好几个地方我都看到了类似这样的声明: “Scala 编译器在编译代码中尽可能使用 Java 数组、基本类型和 native 算术”(《Scala 编程》一书)。但实际上我没有看到这一点,例如在下面的
术语“同步原语”到底是什么意思?例如:互斥锁,关键部分,等待计时器,事件,监视器,条件变量,信号量。它们都是同步原语吗?我还没有列出其他同步原语吗?这些是有效的问题吗? 最佳答案 同步原语是平台(例如
我正在通读 Rubinius source code ,我不断遇到类似这样的方法: def self.do_something Rubinius.primitive :vm_do_somethin
我正在用解释器编写类似 Scheme 的程序。类似 Scheme 的解释器应该可以很好地与任何实现 IEnumerable 的对象一起工作,这似乎很自然。 解释器不允许突变 - 没有暴露有副作用的函数
ASP.NET Web Api 函数返回一个简单的 JSON 字符串。 当我从 angularjs 调用这个函数时,我得到一个带引号的字符串,而不是一个简单的字符串: return $http.pos
我正在将一个项目(不是我最初的项目)从 python2 转换为 python3。 在我的一个脚本中: sk = (key.Sub[0]/["point", ["_CM"]]).value 这适用于 p
我在一周前运行良好的应用程序中实现了指纹身份验证。没有更改代码,我现在收到以下错误: FATAL EXCEPTION: main Caused by: java.lang.IllegalSta
我在从 URL 接收 JSON 数组时遇到问题。我已经验证我的链接没问题,并且返回了正确的 JSON 数组,它甚至显示在错误消息中。我不确定这是什么意思。 错误: 04-17 21:34:04.435
我是一名优秀的程序员,十分优秀!