- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个非常痛苦的库,目前它正在接受 C# 字符串作为获取数据数组的方式;显然,这使得 pinvoke 的编码更容易。
那么如何把ushort数组按字节转成字符串呢?我试过:
int i;
String theOutData = "";
ushort[] theImageData = inImageData.DataArray;
//this is as slow like molasses in January
for (i = 0; i < theImageData.Length; i++) {
byte[] theBytes = System.BitConverter.GetBytes(theImageData[i]);
theOutData += String.Format("{0:d}{1:d}", theBytes[0], theBytes[1]);
}
我可以这样做,但它并没有在任何接近合理时间的地方完成。
我应该在这里做什么?去不安全?通过某种 IntPtr 中间体?
如果它是 C++ 中的 char*,这会容易得多...
编辑:函数调用是
DataElement.SetByteValue(string inArray, VL Length);
其中 VL 是“值长度”,一种 DICOM 类型,函数本身由 SWIG 生成为 C++ 库的包装器。似乎选择的表示形式是字符串,因为它可以相对容易地跨越托管/非托管边界,但是在项目中的整个 C++ 代码(这是 GDCM)中,char* 只是用作字节缓冲区。因此,当您想设置图像缓冲区指针时,在 C++ 中它相当简单,但在 C# 中,我遇到了这个奇怪的问题。
这是黑客攻击,我知道最好的办法可能是让 SWIG 库正常工作。我真的不知道该怎么做,宁愿在 C# 端有一个快速的解决方法,如果存在的话。
最佳答案
P/Invoke 实际上可以处理您在大多数情况下使用 StringBuilder 创建可写缓冲区之后的操作,例如参见 pinvoke.net on GetWindowText and related functions .
但是,除此之外,数据作为 ushort,我假设它是用 UTF-16LE 编码的。如果是这种情况,您可以使用 Encoding.Unicode.GetString(),但这将执行字节数组而不是 ushort 数组。要将 ushorts 转换为字节,您可以分配一个单独的字节数组并使用 Buffer.BlockCopy,如下所示:
ushort[] data = new ushort[10];
for (int i = 0; i < data.Length; ++i)
data[i] = (char) ('A' + i);
string asString;
byte[] asBytes = new byte[data.Length * sizeof(ushort)];
Buffer.BlockCopy(data, 0, asBytes, 0, asBytes.Length);
asString = Encoding.Unicode.GetString(asBytes);
但是,如果不安全代码没问题,您还有另一种选择。以 ushort* 形式获取数组的开头,并将其硬转换为 char*,然后将其传递给字符串构造函数,如下所示:
string asString;
unsafe
{
fixed (ushort *dataPtr = &data[0])
asString = new string((char *) dataPtr, 0, data.Length);
}
关于C# ushort[] 到字符串的转换;这可能吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/274158/
在 .NET Core 上的 C# 中,我正在寻找最快的方法来检查给定的 ushort 是否存在。值存在于 Span 中范围。天真的选项包括枚举跨度,但我强烈怀疑通过 SIMD(即 SSE 或 AVX
在另一个线程中,有人问为什么要添加两个 ushort值在 C# 中引发错误。例如 ushort x = 4; ushort y = 23; ushort z = x+y; // ERROR cann
代码的目的是将两个字节合并为ushort。所有变量都是ushort类型,但M_hi和M_lo加载的是一个字节。我最初将它们作为字节,但发生了这个错误,所以我尝试使用 ushort 第一部分屏蔽了较高的
我收到 VB 错误:“‘Ushort’类型的值无法转换为‘Ushort()’”。 我有一个 VB.NET Windows 应用程序调用 native (C++) DLL 中的函数,以从 DLL 中的页
我有一个非常痛苦的库,目前它正在接受 C# 字符串作为获取数据数组的方式;显然,这使得 pinvoke 的编码更容易。 那么如何把ushort数组按字节转成字符串呢?我试过: int i; Strin
如果我像这样声明一个继承自 ushort 的枚举: public enum MyEnum : ushort { A = 0, B = 1 }; 然后像这样检查它的类型: if(typeof(MyEnu
我在 C 中插入 memcpy() 函数,因为目标应用程序使用它来连接字符串,我想找出正在创建的字符串。代码是: void * my_memcpy ( void * destination, cons
我想知道如何有效地读取和写入特定位到 ushort 整数。 方法应该是这样的: // Sets the bit positioned at bitNumber in the ushort intege
我有一个由两个字节组成的 ushort。 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 Y = bits 10-0, twos complement mantissa i
我在 ushort 变量中有一张图片,想以二进制格式保存这张图片。 请任何人告诉我如何使用 C# 完成此操作? 我试过了,但是不行 ushort[] Depthdata; Depthdata = ne
这是我的问题。请容忍我给出一点解释: 我正在将 tiff 图像读入缓冲区;我的 tiff 的每个像素都由一个 ushort 表示(16 位数据,非负数)。 我的图像大小是 64*64 = 4096。当
假设我有一个 ushort 值,我想设置位 1 到 4(假设 0 是 LSB,15 是 MSB)。 在 C++ 中,您可以定义一个映射特定位的结构: struct KibblesNBits {
考虑以下代码: ushort a = 60000; a = (ushort)(a * a / a); Console.WriteLine("A = " + a); //这会打印出 53954。为什么
我有一组 ushort 像素数据,我需要将其保存为 jpeg 文件。根据我的发现,我可以使用 Image.Save(path, ImageFormat.Jpeg); 但我不知道如何将 ushort 数
我知道 byte、unsigned short 和 integer 在内存使用上的区别,但是当涉及到 BufferedImage 时,它们之间是否存在“速度”差异? 我一直在我的代码中使用 Ima
我在为嵌入式平台改编一段代码时遇到了一些麻烦。 eMBFuncReadCoils( UCHAR * pucFrame, USHORT * usLen ) 上面一行是我遇到问题的函数的原型(protot
我有一个 UShort 变量 Temp,它的值为 1。 如何将这个值的最高位设置为1。 最佳答案 您使用 或 覆盖“最左边”的位: ushort temp=1; temp |= 1<<15; 其中 1
这个问题在这里已经有了答案: 10年前关闭。 Possible Duplicate: How do you return 'not uint' in C#? 大家好, 我正在尝试将以下内容从 VB.N
我需要能够将两个 ASCII 字节打包成一个 ushort。我怎样才能做到这一点? 到目前为止我有: for (var i = 0; i > 8); byte b2 = (byte)(x & 255)
我需要对 16 位整数 (ushort/UInt16) 执行按位左移,但 C# 中的按位运算符似乎仅适用于 int(32 位)。我如何在 ushort 上使用 <<,或者至少通过简单的解决方法获得相同
我是一名优秀的程序员,十分优秀!