- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我正在尝试将 javascript 函数转换为 C# 脚本。 javascript 版本所做的一件事是从现有的 Float32Array 的 .buffer 创建一个 Uint32Array
有谁知道这在 C# 中的等价物是什么?我不是在谈论 C# 中的 Float32Array 和 Uint32Array 是什么,我是在谈论使用 dst 变量的缓冲区初始化 javascript 类型数组的方式(参见代码)... https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/TypedArray这很重要,因为其他数组稍后会在此函数之后使用(例如)var dstUint32 = new Uint32Array(dst.buffer)...进行初始化...
这是代码(src 是一个现有的 Float32Array - 请参阅下面的一些初始值)...
compileClassifier = function(src, width, scale, dst) {
width += 1;
if (!dst) dst = new Float32Array(src.length);
var dstUint32 = new Uint32Array(dst.buffer);
dstUint32[0] = src[0];
dstUint32[1] = src[1];
var dstIndex = 1;
for (var srcIndex = 1, iEnd = src.length - 1; srcIndex < iEnd; ) {
dst[++dstIndex] = src[++srcIndex];
var numComplexClassifiers = dstUint32[++dstIndex] = src[++srcIndex];
for (var j = 0, jEnd = numComplexClassifiers; j < jEnd; ++j) {
var tilted = dst[++dstIndex] = src[++srcIndex];
var numFeaturesTimes3 = dstUint32[++dstIndex] = src[++srcIndex] * 3;
if (tilted) {
for (var kEnd = dstIndex + numFeaturesTimes3; dstIndex < kEnd; ) {
dstUint32[++dstIndex] = src[++srcIndex] + src[++srcIndex] * width;
dstUint32[++dstIndex] = src[++srcIndex] * (width + 1) + ((src[++srcIndex] * (width - 1)) << 16);
dst[++dstIndex] = src[++srcIndex];
}
} else {
for (var kEnd = dstIndex + numFeaturesTimes3; dstIndex < kEnd; ) {
dstUint32[++dstIndex] = src[++srcIndex] + src[++srcIndex] * width;
dstUint32[++dstIndex] = src[++srcIndex] + ((src[++srcIndex] * width) << 16);
dst[++dstIndex] = src[++srcIndex];
}
}
var inverseClassifierThreshold = 1 / src[++srcIndex];
for (var k = 0; k < numFeaturesTimes3; ) {
dst[dstIndex - k] *= inverseClassifierThreshold;
k += 3;
}
if (inverseClassifierThreshold < 0) {
dst[dstIndex + 2] = src[++srcIndex];
dst[dstIndex + 1] = src[++srcIndex];
dstIndex += 2;
} else {
dst[++dstIndex] = src[++srcIndex];
dst[++dstIndex] = src[++srcIndex];
}
}
}
dst = dst.subarray(0, dstIndex + 1);
return dst;
}
其中的 src 变量是由此创建的(这是一个非常精简的版本,完整版本有数千个数字):-
var classifier = [20,20,0.8226894140243530,3,0,2,3,7,14,4,-1.,3,9,14,2,2.,4.0141958743333817e-003,0.0337941907346249,0.8378106951713562,0,2,1,2,18,4,-1.,7,2,6,4,3.,0.0151513395830989,0.1514132022857666,0.7488812208175659,0,2,1,7,15,9,-1.,1,10,15,3,3.,4.2109931819140911e-003,0.0900492817163467,0.6374819874763489,6.9566087722778320,16,0,2,5,6,2,6,-1.,5,9,2,3,2.,1.6227109590545297e-003,0.0693085864186287];
src = new Float32Array(classifier);
这是 dstUint32 和 dst 分别在控制台中记录的内容,这些数字设置为 src(该函数不适用于这些数字,因为正如我所说,实际数组要长得多)有趣的是,几乎没有一个数字与原始数组匹配...
[20, 20, 1062378438, 3, 0, 6, 1641, 61341710, 3279494571, 2109, 30670862, 1140399531, 1024093127, 1062632131, 0, 6, 469, 61341714, 3263430756, 475, 61341702, 1128661142, 1041959952, 1061140142, 0, 6, 1639, 138018831, 3278731586, 2341, 46006287, 1144134386, 1035496386, 1059271173, 1088330890, 16, 0, 6, 1409, 92012546, 3290042412, 2111, 46006274, 1150947372, 1032712617, 4294967295, 4294967295, 0, 4294967295, 4294967295, 4294967295, 0, 4294967295, 4294967295, 4294967295, 0, 4294967295, 4294967295, 4294967295, 0, 4294967295, 4294967295, 4294967295, 0, 4294967295]
[2.802596928649634e-44, 2.802596928649634e-44, 0.822689414024353, 4.203895392974451e-45, 0, 8.407790785948902e-45, 2.2995307799570248e-42, 9.874165102541455e-37, -249.1158905029297, 2.955338461261039e-42, 7.787657921469055e-38, 498.2317810058594, 0.03379419073462486, 0.8378106951713562, 0, 8.407790785948902e-45, 6.572089797683392e-43, 9.874168689865524e-37, -66.00076293945312, 6.656167705542881e-43, 9.874157927893318e-37, 198.00228881835938, 0.1514132022857666, 0.7488812208175659, 0, 8.407790785948902e-45, 2.2967281830283752e-42, 5.597240788537616e-34, -237.47366333007812, 3.280439704984397e-42, 2.7918024463192472e-37, 712.4210205078125, 0.09004928171634674, 0.6374819874763489, 6.956608772277832, 2.2420775429197073e-44, 0, 8.407790785948902e-45, 1.9744295362336673e-42, 1.1848984491218286e-35, -616.252685546875, 2.958141058189689e-42, 2.7917995316184414e-37, 1232.50537109375, 0.06930858641862869, NaN, NaN, 0, NaN, NaN, NaN, 0, NaN, NaN, NaN, 0, NaN, NaN, NaN, 0, NaN, NaN, NaN, 0, NaN]
所以你可以在这里看到代码
dstUint32[0] = src[0];
dstUint32[1] = src[1];
似乎已将 dstUint32[0]/dstUint32[1] 和 dst[0]/dst[1] 设置为某物,只是在 dst[0]/dst[1] 中,值被记录为 2.802596928649634e -44 而不是 20?
最佳答案
UInt32Array
的等价物是 UInt32[]
。Float32Array
的等价物是 float[]
。ArrayBuffer
的等价物是 byte[]
。JavaScript 类型数组是数组缓冲区的 View 。因此,UInt32Array 中的元素不会转换为 float ,而是将物理存储的内容(位)重新解释为 float 。
要在 C# 中执行此操作,您需要执行以下操作之一。
如果您关心共享数组缓冲区
如果您关心共享数组缓冲区,即您需要更改一个数组以立即显示在另一个数组中,那么您需要实现整个事情。 C# 不提供开箱即用的功能。为了实现它,您需要使用 InteropServices.Marshal
工具。这些将允许您访问底层内存。
如果您不关心共享数组缓冲区
如果你只想在一个方向上转换,然后可能稍后再转换回来,但你不需要更改立即可见,或者使用共享 ArrayBuffer,你的工作会更容易。
像这样:
static byte[] ReinterpretAsByteArray(UInt32[] a)
{
using (MemoryStream s = new MemoryStream())
{
using (BinaryWriter w = new BinaryWriter(s, Encoding.Unicode, true))
{
for (int i = 0; i < a.Length; i++)
{
w.Write(a[i]);
}
}
return s.ToArray();
}
}
static float[] ReinterpretAsFloatArray(byte[] b) {
using (MemoryStream s = new MemoryStream(b, false)) {
using (BinaryReader r = new BinaryReader(s, Encoding.Unicode, true))
{
float[] f = new float[b.Length / 4]; // 4 = sizeof float
for (int i = 0; i < b.Length; i++)
{
f[i] = r.ReadSingle();
}
return f;
}
}
}
您将需要编写一个类似的函数来将字节数组转换为 Uint32 数组,并将 float 组转换为字节数组,但这是改变两行的问题。
关于javascript - C# 等效于从现有数组的 .buffer 创建的 javascript TypedArray?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34956550/
我期望 new Buffer(buffer.toString()) 始终是逐字节相等的。但是,我遇到的情况并非如此。 首先,这是一个真实的案例: var buf1 = new Buffer(32);
我有用于记录数据的 Protocol Buffer 。 message Message { required double val1 = 1; optional int val2 =
请注意以下简单程序(基于 protobuf-net 项目 v1 wiki 中的示例): using System.Collections.Generic; using System.Diagnosti
在 Protocol Buffer 中,有没有办法让消息包含嵌套消息的集合?例如,消息主管可能有一个员工集合以及主管的姓名和部门。 最佳答案 是的。您使用 repeated领域; message Em
我想知道 Protocol Buffer 在解析流时如何处理损坏的数据。有没有办法知道数据是否已损坏。 Protocol Buffer 是否提供任何内置的数据完整性检查机制? 谢谢, 最佳答案 没有任
Protocol Buffer 如何处理类型版本控制? 例如,当我需要随时间更改类型定义时?就像添加和删除字段一样。 最佳答案 Google 设计的 protobuf 对版本控制非常宽容: 意外数据要
我尝试阅读 Protobuf 文档,但无法想象它可以用于许多用例。我想知道一些实际的 Protocol Buffer 性能改进用例。 谢谢 最佳答案 Protocol buffers 是一个序列化库,
给定 Protocol Buffer 模式和一些数据, Protocol Buffer 序列化是否跨库和语言具有确定性? 基本上,无论使用什么库,我是否可以保证相同的数据总是以相同的方式(直到字节)序
我正在使用一个示例 UWP C++/CX 程序,该程序创建两个 UDP 网络通信线程,它们使用 Windows::Storage::Streams::DataWriter 相互发送数据。和 Windo
我正在使用以下代码 int lenSend = odl->ByteSize(); char* buf = (char *)malloc(lenSend); odl->SerializeToArray(
Protocol Buffer 文档警告说...... You should never add behaviour to the generated classes by inheriting fr
我有一个定义如下的原型(prototype)模式, message User { int64 id = 1; bool email_subscribed = 2; bool sms_
我试图了解 Protocol Buffer 编码方法,将消息转换为二进制(或十六进制)格式时,我无法理解嵌入消息的编码方式。 我猜可能和内存地址有关,但我找不到准确的关系。 这是我所做的。 第 1 步
我需要序列化和反序列化一系列与字节流之间的 Protocol Buffer 消息。有一些预先确定的消息类型。编码类型信息的推荐方法是什么,以便我的应用程序可以知道它应该读取哪种类型? 最佳答案 最常见
与GSON相比, Protocol Buffer (protobuf)的优缺点是什么? 在什么情况下,protobuf比GSON更合适? 对于一个非常笼统的问题,我感到抱歉。 最佳答案 json(通过
message Person { required Empid = 1 [default = 100]; required string name = 2 [default = "Raju"]
我正在研究一个小型设备,该设备具有相当大的一组配置参数(~100 KB),这些参数是从 PC 软件生成的。过去,我们将参数存储在二进制文件中并将它们加载到数据结构中。维护有点烦人(不同的语言,确保结构
来自Encoding - Protocol Buffers - Google Code上的“签名类型”: ZigZag encoding maps signed integers to unsigne
我正在使用 Protocol Buffer ,一切正常。除了我不明白的事实 - 为什么我需要 proto 中的编号标签文件 : message SearchRequest { required s
Protocol Buffer 的吸引人的功能之一是它允许您扩展消息定义,而不会破坏使用较旧定义的代码。对于枚举according to the documentation: a field with
我是一名优秀的程序员,十分优秀!