我有一个short数组,其值介于0和short的最大值之间.我缩放数据(将其显示为TYPE_USHORT),以便生成的短值范围在0到65535之间.我需要打印一些缩放值,但无法弄清楚如何.数据位于数组和BufferedImage中.
这是我的问题.请跟我说一点解释:
我正在读取tiff图像到缓冲区; 我的tiff的每个像素由一个ushort(16位数据,非负数)表示.
我的图像大小是64*64 = 4096.当我的tiff加载到缓冲区时,缓冲区长度因此是8192(两倍于4096).我想这是因为在我的缓冲区中,计算机使用2个字节来存储单个像素值.
我想得到任何特定像素的值,在这种情况下,我应该将每2个字节组合为1个ushort吗?
例如:00000000 11111111 - > 0000000011111111?
这是我的代码:
public static void LoadTIFF(string fileName, int pxlIdx, ref int pxlValue)
{
using (Tiff image = Tiff.Open(fileName, "r"))
{
if (image == null)
return;
FieldValue[] value = image.GetField(TiffTag.IMAGEWIDTH);
int width = value[0].ToInt();
byte[] buffer = new byte[image.StripSize()];
for (int strip = 0; strip < image.NumberOfStrips(); strip++)
image.ReadEncodedStrip(strip, buffer, 0, -1);
// do conversion here:
//ushort bufferHex = BitConverter.ToUInt16(buffer, 0);
image.Close();
}
}
Run Code Online (Sandbox Code Playgroud)
如何读取byte []缓冲区以确保我可以获得16位的ushort像素值?
谢谢
我有一个 ushort 数组,需要转换为字节数组才能通过网络传输。
一旦它到达目的地,我需要将它重新转换回原来的 ushort 数组。
超短数组
是一个长度为 217,088 的数组(分解图像 512 x 424 的一维数组)。它存储为 16 位无符号整数。每个元素为 2 个字节。
字节数组
出于网络目的,需要将其转换为字节数组。由于每个 ushort 元素值 2 个字节,我假设字节数组长度需要为 217,088 * 2?
在转换和正确“取消转换”方面,我不确定如何做到这一点。
这是针对 C# 语言的 Unity3D 项目。有人能指出我正确的方向吗?
谢谢。
我想取 ushort 列表的最大值,当该列表为空时,我想将默认值设置为“1”。
例如:
List<ushort> takeMaxmumId = new List<ushort>();
var max = takeMaxmumId.Select(x=>x).DefaultIfEmpty(1).Max();
Run Code Online (Sandbox Code Playgroud)
在我的示例 Visual Studio 中向我显示此错误:
“IEnumerable”不包含“DefaultIfEmpty”的定义,最佳扩展方法重载“Queryable.DefaultIfEmpty(IQueryable, int)”需要“IQueryable”类型的接收器
当我的列表类型为 int 时,我没有任何问题,ushort 类型中有什么问题?我怎样才能以最好的方式解决这个问题?
我需要从ushort arrayB中具有相同长度的相应索引值中快速减去ushort arrayA中的每个值.
另外,如果差异为负,我需要存储零,而不是负差.
(确切地说,长度= 327680,因为我从另一个相同大小的图像中减去640x512图像).
下面的代码目前需要大约20ms,如果可能的话,我想在~5ms内将其降低.不安全的代码是可以的,但请提供一个例子,因为我不擅长编写不安全的代码.
谢谢!
public ushort[] Buffer { get; set; }
public void SubtractBackgroundFromBuffer(ushort[] backgroundBuffer)
{
System.Diagnostics.Stopwatch sw = new System.Diagnostics.Stopwatch();
sw.Start();
int bufferLength = Buffer.Length;
for (int index = 0; index < bufferLength; index++)
{
int difference = Buffer[index] - backgroundBuffer[index];
if (difference >= 0)
Buffer[index] = (ushort)difference;
else
Buffer[index] = 0;
}
Debug.WriteLine("SubtractBackgroundFromBuffer(ms): " + sw.Elapsed.TotalMilliseconds.ToString("N2"));
}
Run Code Online (Sandbox Code Playgroud)
更新:虽然它不是严格意义上的C#,为了其他人的利益,我终于最终使用以下代码将C++ CLR类库添加到我的解决方案中.它运行在~3.1ms.如果使用非托管C++库,则运行时间约为2.2毫秒.由于时差很小,我决定使用托管库.
// SpeedCode.h
#pragma once
using namespace System;
namespace SpeedCode
{
public ref class SpeedClass …
Run Code Online (Sandbox Code Playgroud) 我正在用Java编写一段代码(我对Java很新),我之前用C#编写过.这是C#中的代码和示例.
ushort number = 0xAABB; // 43707
byte[] data = new byte[2];
EndianBitConverter.Big.CopyBytes(number, data, 0); // value[0] = 170, value[1] = 187
Run Code Online (Sandbox Code Playgroud)
我在.NET中使用自定义位转义器,因为它默认为小端.无论如何,根据我对java的理解,如果我想使用与byte []相同的结果,我应该期望我的值(170和187)小一点(Byte.MAX_VALUE + 1),即(42,59) - 由于.net和java具有不同的字节范围.这是我用Java编写的模仿上述逻辑的内容.
public class Ushort {
private int value = 0;
public Ushort(int i) {
value = i - (Short.MAX_VALUE + 1);
}
public int get() {
return value;
}
public byte[] getBytes() {
byte[] result = new byte[]{
(byte) (value >>> 24),
(byte) (value >>> 16),
(byte) (value >>> 8),
(byte) value};
return …
Run Code Online (Sandbox Code Playgroud) 我有这个扩展方法:
public static bool In<T>(this T source, params T[] list)
{
return list.Contains(source);
}
Run Code Online (Sandbox Code Playgroud)
现在我需要使用上面的方法来实现ushort
.当我尝试
ushort p = 3;
if (p.In(1, 2, 3, 4, 5))
return;
Run Code Online (Sandbox Code Playgroud)
第一行蒙上3
一个ushort
很好.但是当3
作为参数传递时,我得到了错误
'ushort'不包含'In'的定义,最好的扩展方法重载'Extensions.In(T,params T [])'有一些无效的参数.
但这有效:
ushort p = 3;
if (Extensions.In(p, 1, 2, 3, 4, 5))
return;
Run Code Online (Sandbox Code Playgroud)
这很奇怪.
为什么它适用于第二个例子,但不是第一个例子?
什么是一个很好的选择,可以帮助我在这里?由于没有文字,short
或者ushort
我没有找到比手动转换每个整数更简单的替代方法:
ushort p = 3;
if (p.In((ushort)1, (ushort)2, (ushort)3, (ushort)4, (ushort)5))
return;
Run Code Online (Sandbox Code Playgroud)我有一个非常痛苦的库,目前正在接受一个C#字符串作为获取数据数组的方法; 显然,这使得针对pinvokes的编组更容易.
那么如何按字节将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]);
}
Run Code Online (Sandbox Code Playgroud)
我可以这样做,但它没有完成任何远远接近理智的时间.
我该怎么办?变得不安全?通过某种IntPtr中间体?
如果它是C++中的char*,那么这将更加容易......
编辑:函数调用是
DataElement.SetByteValue(string inArray, VL Length);
Run Code Online (Sandbox Code Playgroud)
其中VL是'值长度',DICOM类型,并且函数本身由SWIG生成为C++库的包装器.似乎选择的表示是字符串,因为它可以相对容易地跨越托管/非托管边界,但是在项目的整个C++代码中(这是GDCM),char*只是用作字节缓冲区.所以,当你想设置图像缓冲区指针时,在C++中它很简单,但在C#中,我遇到了这个奇怪的问题.
这是hackeration,我知道最好的办法是让SWIG库正常工作.我真的不知道该怎么做,宁愿在C#方面快速解决,如果存在的话.
如何在C#中将ushort分成两个字节变量?
我尝试了以下(package.FrameID是ushort):
当我尝试用纸和笔来计算时,我得到了正确的结果.此外,如果FrameID大于一个字节(因此第二个字节不为零),它就可以工作.
array[0] = (byte)(0x0000000011111111 & package.FrameID);
array[1] = (byte)(package.FrameID >> 8);
Run Code Online (Sandbox Code Playgroud)
在我的情况下,package.FrameID是56,array [0]中的结果是16而不是56.
我怎样才能解决这个问题?
我被变量格式困住了。我知道这是一个愚蠢的问题,但我已经思考了两个小时,我已经失去了理智。
问题是:
我有:
command.Data = new ushort[] { xx, yy, zz };
Run Code Online (Sandbox Code Playgroud)
我需要做的是:
ushort zz = System.Math.Tan(c1AngleX);
Run Code Online (Sandbox Code Playgroud)
但是 System.Math.Tan 的输出是“double”,所以我有点不能在那里有“ushort”。
我试过这个
ushort zz = (Convert.ToUInt16 (System.Math.Tan(c1AngleX));
Run Code Online (Sandbox Code Playgroud)
但这不起作用。(无法将“双精度”转换为“字符串”)
有什么方法可以将“double”转换为“ushort”吗?
(如果这个问题“太琐碎”,我很抱歉,但我真的被困住了)
我已经研究了与我的查询相匹配的所有问题并尝试了他们的解决方案,但似乎没有一个对我有用,所以我问如何将字符串转换为ushort
我已准备好此设置
public static string vid
{
get { return "<vehicleid>"; }
}
Run Code Online (Sandbox Code Playgroud)
我尝试过使用这个:short[] result = vid.Select(c => (ushort)c).ToArray();
但是当我将视频ushort放入这个位时
[RocketCommand("vehicle", "This command spawns you a vehicle!", "<vehicleid>", AllowedCaller.Player)]
public void ExecuteCommandVehicle(IRocketPlayer caller, string[] command)
{
UnturnedPlayer spawner = (UnturnedPlayer)caller;
spawner.GiveVehicle(vid);
}
Run Code Online (Sandbox Code Playgroud)
我收到以下错误:
严重性代码 说明 项目文件行抑制状态错误 CS1503 参数 1:无法从 'string' 转换为 'ushort' arena v by FridgeBlaster C:\Users\Jonathan\Documents\Visual Studio 2015\Projects\arena v by FridgeBlaster\arena v by FridgeBlaster\vehicle.cs 71 活动
目前,我正在声明并初始化这样的列表:
List<ushort> myList = new List<ushort>() {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
Run Code Online (Sandbox Code Playgroud)
我最终会有更多ushort
列表包含超过10个值,例如,输入1-100之间的每个数字效率很低.该列表将始终是一系列数字.
有没有更短的方式来写这个?我尝试过研究Enumerable.Range
,但只处理int
值,我收到"无法隐式转换类型int到ushort"错误.
ushort ×13
c# ×11
.net ×2
arrays ×2
byte ×2
java ×2
string ×2
bytearray ×1
bytebuffer ×1
converters ×1
cpu-word ×1
dicom ×1
double ×1
linq ×1
list ×1
performance ×1
short ×1
subtraction ×1
unsigned ×1